命名空间
对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
命名空间可以嵌套,同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成到同一个命名空间中
一个命名空间就定义了一个作用域,命名空间中的所有内容都局限于该命名空间中
缺省参数
声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则默认值,否则使用指定的实参。
半缺省参数必须从右往左依次来提供,不能间隔着给出
缺省参数不能同时在函数声明和定义中出现,缺省值只在声明中出现
缺省值必须是常量或者全局变量
C语言不支持
函数重载
同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同,用来处理实现功能类似数据类型不同的问题
名字修饰(name mangling)
程序的几个阶段:预处理、编译、汇编、链接
name mangling 是一种在编译过程中,将函数、变量的名称重新改编的机制,简单来说就是编译器为了区分各个函数,将函数通过一定算法,重新修饰为一个全局唯一的名称
C语言的名字修饰规则非常简单,只是在函数名字前面添加了下划线。所以不支持函数重载
C++中被修饰后的名字中包含了:函数的名字和参数类型。所以支持函数重载
extern "C": 告诉编译器,将该函数按照C语言规则编译
引用
给已存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
注意:引用类型必须和引用实体是同种类型的
引用特性:
引用在定义时必须初始化
一个变量可以有多个引用
引用一旦引用一个实体,再不能引用其他实体
注意:不能返回栈空间上的引用
引用和指针的区别:
引用在定义时必须初始化,指针没有要求
引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个类型实体
没有null引用,但有null指针
sizeof中含义不同
自增运算含义不同
有多级指针,没有多级引用
访问实体方式不同,指针需要显式解引用,引用是编译器自己处理
引用比指针安全
内联函数
以inline修饰的函数叫内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,提升运行的效率
特性:
以空间换时间,省去调用函数的开销,代码很长或者有循环/递归的函数不适宜用内联函数
inline对于编译器只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉内联
宏的优缺点
优点:
增强代码的复用性
提高性能
缺点:
不方便调试宏(因为预编译阶段进行了替换)
导致代码可读性差,可维护性差,容易误用
没有类型安全的检查
C++有哪些技术替代宏
常量定义 换用const
函数定义 换用内联函数
类型重定义 换用typedef