当const与类和对象对眼时,会产生三种情况:
1、const修饰类的成员变量:
class A
{
public:
A(int b):ma(b){}
private:
const int ma ;
};
首先,const修饰类的成员变量是带常性的,所以它必须在定义时初始化。而类只有在实例化对象时才会对成员变量进行初始化。所以const修饰类的成员变量时,必须依靠构造函数的初始化列表来对它进行初始化。
2、const修饰对象:
定义常对象的一般形式为
类名 const 对象名(实参列表);
const 类名 对象名(实参列表);
const修饰的对象是常对象,其内容不可变。而且常对象只能调用常方法(这样做的原因是担心非常方法可能会修改常对象数据)。有时候有需求修改常对象里的chen成员变量,可以在该成员变量定义时加上mutable关键字,声明它是可修改的。
3、const修饰类的成员方法
const修饰类的成员方法又叫常方法,个人认为它就是为了访问常对象里的数据而生成的。它只能访问常对象的成员变量,而不能做修改(mutable关键字修饰的例外)。
class A
{
public:
A(int b):ma(b){}
void Print() //const
{
cout<<ma<<endl;
}
private:
int ma ;
};
int main()
{
const A b(1);
b.Print();
}
这里屏蔽掉成员方法后的const则会出现“A::Print”: 不能将“this”指针从“const A”转换为“A &”的错误。如果此时的Print函数去试图修改成员变量的值,也不会被允许。值得提醒的是:普通对象可以调用常方法。
总结:1、const修饰一个变量时,它会给该变量加上常性,不能被修改。
2、访问和修改的关系图。