目录
- 1. 命名空间
 - 2. 输入输出
 - 3. 缺省参数
 - 4. 函数重载
 - 为什么C++支持函数重载?
 
- 5. 引用
 - 5.1 引用作函数参数(输出型参数)
 - 5.2 作函数的返回值
 - 关于函数的返回值:
 
- 5.3 引用权限
 - 关于类型转换:
 
- 5.4 引用和指针
 
- 6. 内联函数
 - 6.1 C++推荐的宏的替代方案
 - 6.2 内联函数的特性
 
1. 命名空间
- 1.1 为解决命名冲突的问题,C++中引入命名空间的概念 
  
- 命名跟库中已有命名冲突
 - 不同开发者间的命名冲突
 
 
- 1.2 一个命名空间就定义了一个作用域(命名空间域)
 - 1.3 变量访问优先顺序:局部域–>全局域–>命名空间域(编译器决定,并不会主动到命名空间搜索)
 - 1.4 命名房间访问: 
  
- 展开命名空间域:
using namespace(本质上是将命名空间暴露到全局域) - 指定访问命名空间域:
N1::n 
 - 展开命名空间域:
 
- 1.5 命名空间的定义 
  
- 命名空间可以定义各种类型的成员,变量、函数…
 - 命名空间可以嵌套定义,可解决空间内可能发生的冲突
 - C++库的命名空间是
std 
 
- 1.6 命名空间的使用 
  
- 项目中尽量不直接展开,可指定访问或者指定展开某个常用命名,如 
using std::cout(项目开发时代码量较大时可能发生与库中命名冲突,故使用指定展开库中常用命令) 
 - 项目中尽量不直接展开,可指定访问或者指定展开某个常用命名,如 
 
namespace N1
{
	int n = 10;
	const char* ch = "hello";
	double f = 3;
	namespace N2
	{
		int b = 20;
		const char* ch = "world";
	}
}
using namespace N1;
int main()
{
	cout << N1::n << endl;
	cout << n << endl;
	cout << N1::ch << endl;
	cout << a << endl;
	cout << ::a << endl;
	
	cout << N1::N2::b << endl;
	cout << N2::b << endl;
	return 0;
}
 
2. 输入输出
cout标准输出对象(控制台),cin标准输入对象(键盘)(需包含< iostream >头文件
以及按命名空间使用方法使用std)endl是C++ 中的换行符<<是流插入运算符,>>是流提取运算符
	cout << "hello " << N1::N2::ch << endl;//hello world!
 
3. 缺省参数
- 3.1 函数定义或声明时,为参数设置一个缺省值,调用函数时若没有指定实参,则使用缺省值 
  
- 全缺省参数,为每个参数设置缺省值
 - 半缺省参数,为某几个参数设置缺省值,必须从左至右依次指定
 
 
- 缺省参数不能在声明和定义中同时出现(一般在声明时指定)
 - 为参数设置的缺省值只能是常量或者全局变量
 
void StackPush(Stack* ps, int defaultCapacity = 3);
 
4. 函数重载
- 允许同作用域中声明几个功能类似的同名函数(参数类型、个数、或类型顺序不同)
 - 调用时自动根据参数(类型、个数、或类型顺序)匹配函数
 - 这里的匹配过程并不会使程序变慢,因为函数调用在编译时已经完成
 
为什么C++支持函数重载?
- 编译器在调用函数时会对函数名进行修饰(不同平台修饰规则不同)
 - Linux下,函数 
int Add(int a, int b),在调用时会被修饰成_Z3Addii 
- 函数调用时无法区分返回值类型,所以单单返回值不同不构成重载
 
int Add(int a, int b)
{
	return a + b;
}
double Add(double a, double b)
{
	return a + b;
}
int main()
{
	cout << Add(2, 3) << endl;
	cout << Add(2.5, 3.14) << endl;
	return 0;
}
 
5. 引用
	int a = 10;
	int& ra = a;
 
5.1 引用作函数参数(输出型参数)
void Swap(int& a, int& b);
 
5.2 作函数的返回值
关于函数的返回值:
当函数返回一个函数栈帧内创建的局部变量时,实际上并不是返回这个变量本身,而是在函数栈帧销毁前将这个变量的值拷贝到了一个临时变量中(这个临时变量通常提前在调用该函数的那个栈帧中,比如main函数栈帧中提前开好的),实际上返回的是这个临时变量(这个临时变量通常由寄存器充当,并具有常性)。
- 当函数返回值是一个被static修饰的静态区变量时(出了函数该变量不销毁),机理也一样,也是通过拷贝到一个临时变量中实现

 
当使用引用返回时:
- 函数返回的对象应是出函数不销毁的对象(出函数操作系统不收回),如static修饰的变量、malloc的空间等
 
对这段代码的引用返回:
-  
  
- 减少了返回值的拷贝
 
 -  
  
- 可以通过调用修改返回值
 
 
int& PosAt(AY& ay, int i)
{
	assert(i < N);
	return ay.a[i];
}
 
5.3 引用权限
- 引用(或指针),在初始化(赋值)时,权限可以缩小,但不能放大(不能引用常量)
 
	//权限平移
	const int c = 2;
	const int& d = c;
	//权限缩小
	int e = 3;
	const int& f = e;
 
关于类型转换:
- 类型转换时,也是通过临时变量实现,这个临时变量具有常性
 - 若直接 
double& rd = i;相当于放大了引用权限,会报错

 
	int i = 10;
	double d = i;
	const double& rd = i;
 
5.4 引用和指针
- 语法上:引用是个别名,没有独立空间
 - 底层实现上,引用是通过指针实现的
 - 引用只能引用一个实体,指针能指向任何一个同类型的实体
 - 语法概念上:引用是变量的别名,指针存储一个变量的地址
 
6. 内联函数
6.1 C++推荐的宏的替代方案
- const 和 enum 替代宏常量
 - inline 替代宏函数 
  
- 宏的优点: 
    
- 1.增强代码的复用性
 - 2.提高性能
 
 - 宏的缺点: 
    
- 1.不能调试
 - 2.没有类型安全检查
 - 3.有时会非常复杂
 
 
 - 宏的优点: 
    
 
6.2 内联函数的特性
- inline 是一种以空间换时间的做法(inline 在编译时会在调用处展开,不会调用栈帧(release模式下观察或debug下设置进行观察)),汇编代码中无call指令
 - inline 对于编译器只是一个建议,一般用于规模较小、流程直接、频繁调用的函数(比如 Swap),(很多编译器不支持内联递归函数)
 - inline 声明和定义分离会导致链接错误,因为 inline 被展开后,函数的地址就不在了,链接就找不到函数了
 



















