先看下面类的定义 (编译通过):
再看这个类的定义(编译未通过):
后者错误的原意是,用const修饰的成员函数内是不允许改变成员变量的值的,但是返回值是成员变量的引用,就可以通过返回值改变成员变量的值,这就使该const的修饰失去作用。比如定义一个const修饰的对象:const Hand myLeftHand; 就可以通过 myLeftHand.number() = 11;改变成员变量的值。
所以后者类的声明是错误的,编译不通过的。
但下面的声明是没问题的:
上面的声明,允许通过:
const Hand myLeftHand;
myLeftHand.number() = 11;
改变成员变量的值。
考虑下面情形,如果类A中含有vector成员,我们要通过该类向vector成员执行添加,删除等操作,该怎么办呢?
这就要用到上面的定义了,如下:
如果用 const vector & colors() const { return _colors; } 定义的话,就不能修改vector了,典型的就是不能调用push_back方法了。 但是去掉了const修饰的函数却不能被const修饰的对象调用,这怎么办? 答案是可以在上面的代码中去掉注释,使两者并存。也就是定义如下的类:
这与 “重载函数不能只是返回值不同” 并不冲突,因为后者多了const修饰函数,也是一种重载。
例如,下面的代码也正确:
补充:
const修饰的对象只能访问const修饰的成员函数,这就要求尽量使用const修饰成员函数,这样才能保证const修饰的对象也能访问该函数。