C++中const使用注意要点(二)

当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<Test*>(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> 转换丢失限定符

原文地址:https://www.cnblogs.com/Harley-Quinn/p/5348424.html