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变量存放位置

  • 局部变量存放在栈区
  • 对于全局对象,编译期一般不分配内存,放在符号表中以提高访问效率
  • 对于字面值常量,存放在常量存储区