2-4 C++ const限定词
目录
- 2.4.1 const之于基本类型(base type)
- 含义
- 编译过程
- 2.4.2 const之于引用
- 含义
- 作用
- 注意点
- 2.4.3 const之于指针
- 含义【两类】
- 变量定义的读法:从左往右
- const之于三种类型的总结比较
- 2.4.3 顶层const(Top-Level const)
- 含义
- 拷贝操作
建议直接看总结和比较,如有需要再看2.4.1—2.4.3了解细节
2.4.1 const之于基本类型(base type)
含义
以const int i = 43为例
-
i的值不可修改 -
因此在定义
i时必须初始化 -
任何试图修改
i的操作都会报错
const int i = get_size(); //ok
const int j = 42; //ok
const int k; //error:未初始化
j = 2; //error:试图修改j的值
编译过程
以const int i = 43为例
- 编译时,编译器会把
i全部替换为43 - 多文件编译时,如果
i要在多文件中共用-
注意点:const修饰符修饰指针本身
-
在定义
i文件时也要extern:extern const int i = 43; -
注:一般文件在多文件共用时只需要在声明时
extern
-
2.4.2 const之于引用
含义
const int &r1 = i指我们无法通过引用r1来改变它所捆绑的对象i的值- const引用必须初始化【只要是引用都必须如此】
作用
-
const对象必须用const引用来绑定,但const引用不一定指向const对象
-
const引用可以绑定类型不完全匹配的对象
-

-
#includeusing namespace std; int main(){ coint i = 3; double pi = 3.14; //pi加上const也可以 const int &r1 = i; //对应类型的plain对象 const int &r2 = pi; //自动类型转换的对象 const int &r3 = 3.14; //自动类型转换的字面量 //输出为“3 3 3” cout<
-
-
注:在const引用绑定自动转换对象时,编译器其实生成了一个临时变量
double pi = 3.14; const int &r2 = pi; //上述代码 在编译时发生了如下过程 const int tmp = pi; //编译器生成了一个临时const变量并进行了类型转换 const int &r2 = tmp; //把临时const变量和r2绑定
注意点
-
const引用绑定的不一定是const对象
- 我们无法通过const引用来改变它所绑定的对象
- 不代表它所绑定的对象本身无法改变
-
注意必须初始化
2.4.3 const之于指针
含义【两类】
-
const 修饰指针指向的对象
const int *p:无法通过指针修改指向对象- const 对象必须用const指针指向,但const指针不一定指向const对象
- 定义时必须初始化
#includeusing namespace std; int main(){ double pi = 3.14; const double *p = π *p = 2.2; //error:无法通过p修改pi pi = 2.2; //pi本身可以修改 //输出“2.2 2.2” cout< -
const 修饰指针对象本身
int * const p:无法修改指针的指向对象#includeusing namespace std; int main(){ double pi = 3.14; double f = 2.2; double *const p = π p = &f; //error:无法修改p的指向对象 return 0; }
变量定义的读法:从左往右
const double *const pip = π
const pip: pip是一个const变量,它的值无法改变*const pip*: pip是一个指针,指针的值无法改变,即指针指向的对象无法改变const double *const pip: pip指向的对象的类型是pip【含义是无法通过pip改变对象的值】
如何理解最后一行?
const之于三种类型的总结比较
明确各个const的含义
| 代码 | const的含义 | 必须初始化 |
|---|---|---|
const int i = 1 |
无法改变i的值 |
是 |
const int &r = i |
无法通过r改变i的值 |
是 |
const int *p = &i |
无法通过p改变i的值 |
否 |
int *const p |
无法改变p指向的对象 |
是 |
- t 对象
要建立引用必须用const 引用,建立指针必须用const int *p` const 引用可以绑定不完全匹配的对象和常量
2.4.3 顶层const(Top-Level const)
含义
- 顶层const(Top-Level const):对象本身是const【值不可变】,可修饰所有数据类型
const int i = 1int *const p【指针的值不可变就等价于指针所指的对象不可变】
- 底层const(Low-Level const):修饰引用和指针类型所绑定的对象类型 , 无法通过引用或指针改变绑定对象的值
const int &r = iconst int *p = &i
拷贝操作


-
顶层const不影响拷贝操作

-
底层const对拷贝操作有限制
-
两边必须有底层const,右值的非const可以转化为const

-
两边类型相同时例外,一个const变量显然可以拷贝给一个同类型的非const变量
const int i = 1; int j = i;这样的拷贝显然是成立的
-
