Warning: 自家学习专用__by Arthur
Noun
- const 限定符:用来阻止被修饰对象被修改,一旦创建就不能被修改,且const对象必须初始化(如引用必须被绑定);唯一的限制就是不支持被修饰对象被修改内容的操作;
- 顶层const与底层const:就指针而言,指针本身是不是常量以及指针所指的是不是一个常量是两个相互独立的问题。*顶层const(top-level const)*表示指针本身是个常量(存储的地址不变,无关内容),底层const表示指针指向的是常量(可以更换指向,即存储的地址可变,但是目前指向的内容是不可变的,常量)
- 类型别名:
typedef double mtd;
using mtd double;
两者的效果是相同的
- **auto **:auto为类型说明符,能够让编译器分析表达式所属的类型;缺点是编译器会适当地改变结果类型使其更符合初始化规则,且一般会忽略掉顶层const;
- decltype:类型指示符,与auto有相似的作用,从表达式的类型推断出要定义的变量的类型,是同decltype会返回该类型(包括顶层const和引用const)
Notation
- 当多个文件定义了同名的const对象,意味着每个文件独享该对象,也就是说const对象不能跨文件共享,若想共享,则采用如下形式:
extern const int val = 110; //in file.cpp, 定义并初始化一个常量,该常量能被其他文件访问
extern const int val; //in file.h, 能够访问在file.cpp中定义的常量
关键在于“extern”的使用;
- 对const的引用,一般简称为常量引用,仍需满足const对象的限制
const int val = 119;
const int& refVal = val;
指针与引用的例外 通常情况下,指针或者引用与所指的对象类型必须是一致的,如:
int val1 = 110; //定义并初始化int变量
int* ptr1 = &val1; //定义了int指针,并指向int变量
int& ref1 = val1; //定了了int引用,并绑定到int变量
但是存在两个例外,对const的引用可能引用一个非const的对象,如:
int i = 110;
const int j = 119; //顶层const
const int* ptr1 = &i; //两边的对象不匹配, 左边是指向常量的指针,右边是变量,(底层const)
const int* ptr2 = &j; //匹配,左边是指向常量的指针,右边是常量(底层const)
const int& ref1 = i; //两边的对象不匹配,左边是对const的引用,右边是变量(底层const)
const int& ref2 = j; //匹配, 左边是对const的引用,右边是常量(底层const)
也就是说,左边可以缩小右边的操作空间,但是不能放大,如:
const int i = 110;
int* ptr = &i; //错误,放大了int常量的操作空间
int& ref = i; //错误,放大了int常量的操作空间
int j = 119;
const int* ptr = &j; //正确,缩小了int常量的操作空间
const int& ptr = j; //正确,缩小了int常量的操作空间
指针顶层与底层const的例子:
int i = 119;
int* const ptr1 = &i; //顶层const,不能修改指针的值
const int j = 110; //顶层const
const int* ptr2 = &j; //底层const, 能够修改指针的值
const int* const ptr3 = ptr2; //靠右的是底层const, 左边是底层const
const int& r = i; //底层const