当const修饰类的成员变量
1、const修饰类的非静态成员时必须在构造函数初始化列表上初始化;
在构造函数内会提示表达式必须是可修改的左值,因为在构造函数内并不是初始化,仅仅是赋值,而const类型必须初始化。
2、const修饰类的静态成员必须在定义的地方对它初始化,因为静态成员是无法在构造函数初始化列表上初始化的;
当const修饰类的成员函数时
1、用const修饰类的对象,那么该对象不能调用任何修改类成员的方法;
2、把const放在成员函数后,比如void f() const {},那么该函数内不能修改类成员;
例外1:可以将this指针强制转换成非const指针来在2的情况下改变类成员
class Test{ int i;public: Test(int ii = 0) : i(ii) {} void f() const { ((Test*)this)->i++; (const_cast(this))->i++; }};
例外2:使用mutable关键字,可以突破const的限制,被mutable修饰的变量将永远处于可变状态
实际往往会使用类的常引用来作为函数参数,这样就不会修改成员变量的值,但是要注意的是调用的方法后必须声明const
class MyClass{public: MyClass(int _val = 0); ~MyClass(void); int Get() { return val; }private: int val;};MyClass copy(const MyClass& bc){ int i = bc.Get(); // Error! return MyClass(i);}
虽然我们知道Get函数不会改变成员变量,但是编译器不知道,这样它就会觉得你调用了可能改变成员变量的函数(Get)。
产生非常常见的编译错误:
error C2662: “MyClass::Get”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
1> 转换丢失限定符