C++ const说明
const 介绍
const 变量必须初始化,因为其存放在 .rodata 段。
直接上代码
#include <iostream>
using namespace std;
class A {
public:
int m1 = 1, m2 = 2;
};
int main() {
A a, b;
const A ca;
const A * p1 = &a; // 被指向的对象不能改变
//p1->m1 = 10; // wrong,因为被指对象不能改变
p1 = &b; // right,因为指针本身可以改变
const A* p2; // 不初始化也可以,反正指针本身可以改变,指针不是常量,也就和普通指针没啥区别
const A* p3 = &ca;
//A* p4 = &ca; // wrong,不允许绑定常量到非const
//const *A p5 = &a; // 语法错误
const const const A* p6 = &a; // 连着写的const没什么特殊意义,等同于"const A* p6 = &a;"
//p6-> = 10; // wrong
p6 = &b; // right
A* const p7 = &a; // 指针本身不可变,所指对象可变
p7->m1 = 10; // right
//p7 = &b; // wrong
A* const const const p8 = &a; // 同样,连着写的const等同于一个
p8->m1 = 20; // right
//p8 = &b; // wrong
const A* const p9 = &a; // 星号在第一个const右边,所指对象不可变;星号在第二个const左边,指针本身不可变
//p9->m1 = 11; // wrong
//p9 = &b; // wrong
A const * p10 = &a; // 星号在const右边,还是所指对象不能改变
//p10->m1 = 10; // wrong
p10 = &b;
const A const * p11 = &a; // 星号在const右边,还是所指对象不能改变;
// 类型A与const的位置没关系,所以前面等同于"const const A",也就是等同于"const const A* p11",和p1等同。
//p11->m1 = 11; // wrong
p11 = &b; // right
//const * const A p12 = &a; // 语法错误,星号一定要在类型A的右边
//const * A const p13 = &a; // 语法错误,星号一定要在类型A的右边
A const const * p14 = &a; // 多个const连写等同于一个const
// 星号在const中间(也就是既有在星号左边的const,也有在星号右边的const),所以指针和所指对象都不可变
// 另外,const和类型A没有顺序之分,等同于"const A * const"
A const * const p15 = &a;
//p15->m1 = 15; // wrong
//p15 = &b; // wrong
return 0;
}
“顶层const"和"底层const”
- 顶层const:
A* const
表示指针本身不可变。 - 底层const:
const A*
表示所指对象不可变。
const引用
引用的性质之一就是本身不可改指其他对象,所以没啥好说的。
const引用都是所指对象不可改变,即都是底层const。
总结
- const与类型声明没有顺序之分
- 多个连写的const等于一个const
- 星号在const左边,即
A * const
,则为顶层const,指针本身不可变 - 星号在const右边,即
const A *
,则为底层const,所指对象不可变