一般来说,const限定符的使用取决于我们是否想把一个变量限定为只读变量,即这个变量一旦初始化后,它就只能作为右值,而不能出现在等号的左边。
事实上,const的知识点有很多:
1、const int a = 10;
将变量定义为只读变量,它的值无法修改,而且它不能声明,必须被初始化。因此在类成员中有const变量时,构造函数必须使用列表初始化(相同的还有引用)
当形参由const修饰时,表示形参的值不可改变
2、const int* a = &m和int *const a = &m;
(和第一点其实一样)
即指针常量和常量指针的区别
·指针常量 = 指向一个常量(其实因该是只读变量)的指针, 这个指针指向一个const修饰的变量,该指针可以改变(即做加减,自增,自减,或是指向其他地址),然而,该指针所指向的只读变量的值不能改变
·常量指针,即该指针的值(就是地址)是只读的,不可改变。它只能指向某个变量,不可改变(常量指针更像是一个变量的引用)
3、const修饰全局函数
即表示该函数的返回值不可改变
4、const修饰成员函数
表示该函数不可修改成员变量的值
若我们想在const成员函数中对某些成员变量进行修改,我们可以使用mutable关键字来修饰想要修改的成员变量
const限定的自定义类型的对象不能调用该对象所属类中的非const成员函数
ps:对于执行相同功能的const成员函数和非const成员函数(我不知道算不算重载),我们应当本着代码不重复的原则,尽量实现一次功能,并使用它两次,这意味着我们要令其中一个函数调用另一个函数。显然,我们不应该const限定的成员函数调用非const函数。
因此,我们应该:
将this指针强制转换成const型,然后调用const限定的成员函数,然后去除const限定。
class A { public: int a; A(int input) :a(input) {}; const int& get() const{ cout << "const" << endl; return a; } int& get() { cout << "非const" << endl;
return const_cast<int&>( static_cast<const A*>(this)->get() ); } };
main函数中代码如下:
int main() { const A temp1(1); temp1.get(); cout << endl; A temp2(1); temp2.get(); system("pause"); return 0; }
输出的结果为:
显然,对于const对象,它直接调用了const成员函数;而对于非const对象,它发生了两次调用,分别是非const成员函数,并在这个函数内部调用了const成员函数