关键字
命名空间
定义
namespace 空间名 {//成员}
使用
- 作用域限定符(::)
- using引入命名空间成员
- using namespace引入命名空间
- 命名空间可以嵌套
- 同一个工程可以存在多个相同名称的命名空间,编译器最后会合成同一个命名空间
输入输出
函数重载
同一作用域中,函数名相同,参数个数或类型或顺序不同
名字修饰
- C:在函数名前添加下划线
- C++:重新修饰的名字包含函数名即参数类型
- 如果函数需要用C风格来编译,在函数前加extern "C"
内联函数
以inline修饰的函数为内联函数,编译时C++编译器在调用内联函数的地方展开
特性
- inline是空间换时间的做法,所以代码很长或者有循环递归的函数不适合使用
- inline对编译器只是一种建议
- inline不建议声明和定义分离,分离会导致链接错误
缺省参数
缺省参数是声明或定义函数时为函数的参数制定一个默认值,调用该函数时,如果没有实参则采用该默认值,否则使用实参
分类
- 全缺省参数
- 半缺省参数:必须从右往左依次给出,同时不能在声明和定义中同时出现
引用
给已定义的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它的引用变量共用一块内存空间,但是在底层是有空间的,因为引用是按照指针方式来实现的
使用方法
- 类型& 引用变量名 = 引用实体;
- 引用类型和引用实体必须是同类型
特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用只能引用一个实体
常引用
使引用变量只具有读属性
使用场景
- 参数
- 返回值:不能用栈上空间作为引用类型返回,返回值的生命周期必须不受函数限制
- 引用和指针在作为参数和返回值类型效率几乎相同
引用和指针的区别
- 引用在定义时必须初始化,指针无要求
- 引用只能引用一个实体,指针可在任何时候指向同一类型的实体
- 没有NULL引用,但有NULL指针
- sizeof:引用结果为引用类型大小,指针始终是地址空间所占字节个数
- 引用的自加即引用实体的自加,指针的自加是向后偏移一个类型大小
- 有多级指针,无多级引用
- 访问实体方式不同,引用编译器处理,指针需显式解引用
- 引用使用比指针相对安全
auto
- 早期C/C++:auto修饰的变量,是具有自动存储的局部变量
- C++11:auto声明的变量必须有编译器在编译时期推导而得
特性
- 使用auto定义变量必须进行初始化,编译器根据初始化表达式推导auto的实际类型
- auto不是类型的声明,而是类型声明时的占位符,编译器在编译时会将auto替换为变量实际类型
- 避免与C++98混淆,C++11只保留auto作为类型指示符的用法
使用场景
- 结合指针和引用:auto声明指针类型时auto和auto*无区别,但用auto声明引用类型必须加&
- 同一行定义多个变量:这些变量必须是相同类型,否则编译会报错,因为编译器只对第一个类型而推导出其他变量的类型
- 范围for循环
- lambda表达式
范围for循环
- for(auto e : array),":"前面部分为迭代变量,后面为迭代范围
- for循环的范围必须是确定的
- 迭代对象要实现++和==操作
不能使用场景
- 不能作为函数的参数
- 不能声明数组
- 不能定义类的非静态成员变量
- 实例化模板时不能使用auto作为模板参数
nullptr
- C++98(NULL):NULL是一个宏,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量
- C++11(nullptr):nullptr代表一个指针的空值常量,与(void*)0所占字节数相同,nullptr类型为nullptr_t,仅仅可以被隐式转化为指针类型,typedef decltype(nullptr) nullptr_t;为了提高代码的健壮性,空指针最好使用nullptr