目录
在C++中,可以有相同的变量名或函数名,为了解决名称冲突或名称污染,所以用【namespace + 空间名】称来划定的一个区域。在这个区域中,所有内容的作用域都仅限于本空间。
1、概念
举一个例子:备胎,可有可无。
在C++中,函数的参数列表可以在定义的时候赋初值,在调用函数时,如果更新了参数的值就使用更新之后的参数,否则就使用初值。在赋初值的时候可以缺省赋值,只给某几个变量赋值,这就叫缺省参数。
当声明和定义分离时,缺省参数只能出现在声明中。
2、用法
a> 可以给每个参数都赋初值
b> 可以缺省地赋值,但是必须从右向左依次赋值或从左往右依次缺省,不能跳格
重载
1、概念
重载就是两个或多个函数,名称一样,功能最好类似,但是参数数量,顺序,类型不同,所以效果不同。常用来处理功能 类似但数据类型不同的问题。
2、原理
a> 实现原理是名称修饰,C/C++中在一个程序的编译阶段,编译器会将函数名,变量名以另一种机制重新编排,修饰为 一个全局唯一的名称。
b> 在C语言中,一个程序的编译阶段会在每个函数名称前面加一个下划线。
c> 在C++中,名称修改较复杂,通过编译机制重新编排的时候,对函数名和变量一并处理,经过修饰之后成为一个全局 唯一的名称,这种编译机制不同平台有不同规定。
1、概念:
举个例子:李逵,铁牛,黑旋风。铁牛喝了一碗酒 = 李逵喝了一碗酒 , 李逵喝了一碗酒 = 铁牛喝了一碗酒。
其实就是为一个变量起了一个别名,有点类似于C中的指针
int a = 10; int& ra = a; rb变量(引用变量名)就是对a变量(引用实体)的引用,int&是引用变量的类型。
2、特点:
从概念上看,引用没有新开辟空间,只是起了一个别名。
但是 实现原理 需要看汇编代码,对比发现同样的代码用指针和引用实现,它们的汇编代码完全一样,所以引用的实现原理是指针,是新开辟了空间的。
3、适用场景
//做形参
void Swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
//做返回值
int& Test(int& a){
a += 10;
return a;
}
//错误示例
//每个函数都有自己的栈帧结构,当函数退出时,栈帧随之销毁
//返回的可能是栈帧销毁之后被覆盖过的值
int& Add(int a, int b){
int temp = a + b;
return temp;
}
4、注意:
a> 引用变量和引用实体的类型必须一样
b> 引用的时候必须初始化
c> 一个引用只能引用一个实体,一个实体可以被多个引用变量引用
5、和指针的区别
a> 有多级指针没有多级引用。
b> 定义指针的时候可以不初始化。
c> 有NULL指针没有NULL引用。
d> 在sizeof中,引用是变量类型的大小,指针大小视平台而定。
e> 自加, 引用时变量值加一, 指针是向后偏移至一个指向类型的位置。
f> 访问实体方式, 指针需要解引用, 引用由编译器完成。
g> 综上,引用相对安全。
1、用法
inline + 函数名
2、概念
a> 可以对比C语言中的宏来理解。C语言中宏在预处理阶段进行简单的文本替换。
b> C++中,如果一个函数名前面加上inline,在编译时就只是对该函数进行文本展开,并没有其独有的栈帧结构。
3、特点
a> 用空间换时间
b> inline只是对编译器的一个建议,建议编译器进行优化,但如果函数代码过长,循环或者递归的话编译器就会忽略这个建议。
4、宏的优缺点
a> 优点:性能提高
代码复用性高
b> 缺点:没有类型检查,容易出错
代码可读性差
不便于调试,因为只是在预编译阶段进行的简单文本替换
5、C++中可以替代宏的技术
a> 内联函数
b> 常量定义改为const 例如#define MAX 100 改成 const int MAX = 100;
c> typedef 类型重定义
(这是标题)extern "C"
在C++中 , 如果在一个函数前面加上这几个字就是告诉编译器按照C的规则来处理这部分代码