- 对于常量来说,系统没有划定专门的区域来保护其中的数据不能被更改。也就是说,使用常量的方式对数据进行保护是通过编译器作语法限制来实现的。我们仍然可以绕过编译器的限制去修改被定义为“常量”的内存区域
const int c = 10;
int* p = (int*)&c;
// 地址 &c == p
// 也就是说 p 和 c 对应的是同一块内存区域
// 但是通过 c 访问这个内存区域的时候,值一直都是 10(这应该是编译器的工作)
*p = 15;
cout << c << endl; // 10
- 引用本来就不能修改值,所以也就没有 const 之说
int i = 10;
int & const c = i; // error
const int & cc = i;; // ok
当存在同名同参数和返回值的常量函数和非常量函数时,具体调用哪个函数是根据调用对象是常量对像还是非常量对象来决定的。常量对象调用常量成员;非常量对象调用非常量的成员。
因为成员函数中有一个隐含参数this
,所以实质上对应const TYPE*
和TYPE*
两种参数类型const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。
const数据成员的初始化只能在类的构造函数的初始化表
中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现。枚举常量不会占用对象的存储空间,他们在编译时被全部求值。
参考链接 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html