1、const 修饰指针和引用
常对象:const Class A
只能调用 const 成员函数
常量指针:const int *
所指的地址内容为 常量只读,但是可指向其它对象的地址(可以重指向)
指针常量:int * const
指针所指的地址不能变(不可以重指向),但地址的内容可以被修改,与引用变量效果类似
常量引用:const int &
相当于是对象的一个别名,对象内容为 只读,并且不能指向其它对象
const int &a = 40 与 constexpr int a = 40 效果类似,但后者只能在全局区声明
const int &a = 40 等同于 const int * const a = new int(40)(指针的指向和存放的内容都不可更改)
ClassA myA(10), myB(-10);
const ClassA a; // 常对象(只能调用常成员函数)
const ClassA * b = &myA; // 常量指针
ClassA * const b = &myA; // 指针常量
const ClassA &bb = myB; // 常量引用
b = &myB; // 合法(可以指向其它对象)
b->setA(10); // 错误(只读)
bb.setA(100); // 错误(只读)
bb = myA; // 错误(不可指向其它对象)
char greet[] = "Hello", w[] = "World";
const char * p = greet;
char * const pp = greet;
cout << p << endl;
*p = 'W'; //error: assignment of read-only location '* p'
// *p = 'W';
p = w; // 合法(常量指针可以改变指向,不能改变存储的内容)
pp = w; //error: assignment of read-only variable 'pp'
// pp = w;
*pp = 'W'; // 合法(指针常量可以改变存储的内容,不能改变指向)
cout << p << endl;
cout << w << endl;
return 0;
2、const变量存放位置
- 局部变量存放在栈区
- 对于全局对象,编译期一般不分配内存,放在符号表中以提高访问效率
- 对于字面值常量,存放在常量存储区