const@C++
1 基础概念
- 如果对变量的类型加以const限定,那么这个变量就不能够被更改,比如
const int bufSize = 512;
bufSize = 1024; /* 错误 */
- const对象必须初始化,因为编译器在编译阶段会将所有用到该变量的地方替换成其对应的值。比如如果有const int bufSize = 512,代码中所有的bufSize都会用512表示
- 如果想在多个文件间共享const对象,必须在变量的定义之前添加extern关键字
extern const int bufSize = fcn();
2 const引用
2.1 引用
- 引用为对象起了另外一个名字
- 引用必须初始化,一旦初始化完成,无法令引用重新绑定到另外一个对象
- 我们说的引用一般是左值引用,C++11新增了一种“右值引用”
2.2 const引用
- 首先要区分普通引用和const引用,const引用不能来修改它所绑定的对象
int i = 12;
int &r1 = i; /* 普通引用 */
const int &r2 = i; /* const引用 */
r1 = 20; /* OK */
r2 = 20; /* Error */
- const引用不是必须绑定const对象,也可以绑定一个非常量
- 但是,如果一个引用是普通引用,它不能绑定到一个const对象,因为非const引用意味着它可以改变绑定的对象,单const对象是不能被改变的
const int i = 10;
int &r = i; /* 错误, 这可能导致通过引用r修改对象i, 但是i是const对象 */
3 const指针
- 指针是对象,const指针表示指针它本身是一个常量,它本身不能被修改
int i = 10;
int k = 20;
int *p1 = &i; /* 普通指针 */
*p1 = 10; /* OK */
int *const p2 = &i; /* const指针,它指向一个int对象 */
*p2 = 20; /* OK */
p2 = &k; /* 错误, p2是const, 它本身不能被修改 */
const int j = 10;
const int *p3 = &j; /*普通指针, 指向一个const对象 */
*p3 = 30; /* 错误,指向的是const对象 */
const int *const p4 = &j; /* const指针,指向一个const对象 */
*p4 = 40; /* 错误,有两个层次 */
- 看是否能修改指针指向的对象,只需要考虑指向对象的类型
- 看指针本身能否修改,只需要考虑它本身是否为const
4 如何理解const int*、const int * const和int const *
参考StackOverflow: What is the difference between const int*、const int * const and int const *
两条原则
- 从右往左读
int*:这是一个指针,指向的类型为int
int const *:这是一个指针,指向的类型为const int
int * const:这是一个const指针,指向的类型为int
int const * const:这是一个const指针,指向的类型为const int - 第一个const可以在类型的任意一边
const int * 和 int const *都表示指向const int类型的指针
const int * const 和 int const * const都表示指向const int类型的const指针
int a = 5, b = 10, c = 15;
const int* foo; // foo是一个指针,指向的类型为const int
foo = &a;
//*foo = 6; // 这是条错误语句,因为foo指向的类型为const int,所以不能修改它所指向的数据
foo = &b // foo是指针,但不是const指针,因此它本身是可以被修改的