首先,const意味着“只读”。
个人理解:c++中,const修饰的对象可以分为两类:a、类似于c语言中的普通数据;b、类的对象和成员函数。
一、修饰普通数据变量
其实,第一类尤其容易理解错误的是:指针常量和常量指针。本文用于帮助区分二者。实际上,通过中文的语法重点,也可以理解它们两个所强调的重点。个人认为,中国人通常喜欢将重要的东西放在后面。所以,上面两个术语其实分别强调了常量和指针。指针常量意在强调常量。常量指针意在强调指针。
- 指针常量:强调常量,意思就是这个指针本身是个常量,所以也就应该写成:
理解的时候可以划分为:(int *)(const p);
- 常量指针:强调指针,意思是这是个指针,不过“它的指向”是个常量,所以写法应该是:
理解的时候可以划分为:(const int)(* p);
二、修饰类的对象
1、修饰对象
- 一个类的对象可以用const修饰,如果一个对象被声明为const,那么就不能通过该对象调用类的非const成员函数。
- 如果在类内定义了const数据成员,那么该成员的初始化必须在构造函数内进行,且初始化后不能被修改。所以,如果不在构造函数内初始化,它是没机会被修改的。const static 类型的除外,它必须在类内直接初始化。
- const必须在构造函数内初始化,且不能使用赋值的方式(=),const数据成员的初始化必须在函数的初始化列表的表头给出,由冒号引出,如果有多个则使用逗号隔开。
-
class Myclass
{private:
int temp;
const int x;
const int y;
public:
Myclass(int);
};
Myclass::Myclass(int):x(10),y(20){temp=30}
- const数据成员只能被构造函数和析构函数修改。
2、const修饰成员函数
- const成员函数可以访问const数据成员和static静态成员函数。不能访问非const成员函数。
- static静态成员函数不能调用const成员函数,因为const成员函数虽然特殊,但是仍然是类的成员函数,是类对象相关的,属于具体的某个对象。