1.常量:const对变量加以限定-----顶层const
const int bufsize = 512;
这样就把bufsize定义成了一个常量。
- 任何试图为bufsize赋值的行为都将引发错误:
bufsize = 512; //错误:试图向const对象写值
因为const对象一旦创建其值就不能再改变,所以const对象必须初始化。
- const对象初始化的方法:
const int i = get_size();
const int j = 42;
int k=52;
const int ci = k
2、常量引用:对常量的引用(对const的引用)----底层const常量的引用不能用作修改它所绑定的对象:
const int ci = 1024;
const int & r1 = ci; //正确:引用及其对应的对象都是常量
r1 = 42; //错误:r1是对常量的引用
int &r2 = ci; //错误:试图让一个非常量引用指向一个常量对象
虽然,这种操作形式对引用可参与的操作做出了限定
但是,对于引用的对象本身是不是一个常量未做限定:
int i =42;
int &r1 = i; //引用r1绑定对象i
const int &r2 = i; // 引用r2也绑定对象i,但是不允许通过r2修改i的值
r1 = 0; // i 的值修改为0
r2 = 0; // 错误:r2 是一个常量引用
3、指针和const
3.1 指向常量的指针:不能用于改变其所指对象的值-----底层const:指针所指的对象是一个常量
const double pi = 3.14 ;
const double *ptr = π
3.2 常量指针:必须初始化 -----顶层cosnt:指针本身是个常量
int errNumb = 0 ;
int * const curErr = &errNumb;//curErr将一直指向errNumb
3.3 顶层const 和底层const的区别:
普通变量没有底层顶层的区别
int const a == const int a
只有对应指针,引用才会有区别:
- 底层说白话就是不允许你对目标值进行修改
- 顶层就是不允许你修改你的目标。
3.3.1底层const
非常量底层const
- 可以赋值给常量底层const;
常量底层cosnt
- 不能赋值给非常量底层const。
举例:
const int* b = &a;//
核心就是这是个指向常量的指针,*b被"const"住了,不能改!
- a可以通过a = x来改变,但不可以通过*b = x来更改。
- 可以将b指向别的地址,变量。例如声明int c =2;b = c。
3.3.2顶层const
非常量顶层const
- 可以赋值给 常量顶层const;
常量顶层cosnt
- 不能赋值给非常量顶层const。
举例:
int * const b = &a;
核心就是这是个指针常量(顶层,先是常量后是指针),b被"const"住了,不能改!
- a既可以通过a = x来改变,也可以通过*b = x来改变
- 但不可以把b指向别的地址、别的变量。例如声明 int c = 2;b=c即会报错
注意:const_cast只是C++的一种无奈之举,详情见const_cast内含
- 当存在某个指向常量的指针(底层cosnt,不允许通过该指针改变其指向的内容),我们需要改变其指向的内容,但缺无法直接获取该变量
- 这时候使用const_cast可以去掉上述指针的const属性,并将其中地址赋予新指针,这个新指针就可以去更改内容。