还有一种指向const对象的const指针,这种指针首先表明,本身是一个const指针,一旦初始化后不能指向其他对象;其次,它本身所指向的对象也是一个常量,即不能通过指针修改对象的值。
const int var = 42; const int* const p = &var;
这里再强调一点,const只是给编译器看的,我们可以很轻松的骗过编译器,并看看编译器都做了什么:
1 const int var = 42; 2 int* p = (int*)&var; 3 *p = 20; 4 cout << var << endl; //42 5 cout << *p << endl; //20
我们在代码的第2行,用一个类型转换强制的,把一个非const指针指向了一个const对象。
但是后面我们通过这个指针来修改这个值,却没有生效,原因呢?
那是因为编译器在编译阶段发现var是一个常量,所以在编译目标代码时已经将var的地方都用42进行了替换。
六、const与类
其实类定义的对象,与普通的变量是一样的,用const修饰时,说明这个类是一个常量类对象,这个对象有下面2个特点:
1)不能改变其成员变量(非mutalbe成员)
2)不能调用其非const成员函数
1 class AClass{ 2 public: 3 int m_var; 4 mutable int m_mutable_var; 5 void setVar(int var){ m_var = var; } 6 void printVar(){ cout << m_var; } 7 void printVar_const()const { cout << m_var; } 8 }; 9 10 const AClass ac; 11 ac.m_var = 20; // Error:ac是一个const类,不能修改成员变量 12 ac.m_mutable_var = 42; // ok 可以修改mutable修饰的变量 13 ac.setVar(20); //