const关键字在类的成员函数上的应用(1)

来源:互联网 发布:linux 查杀进程 编辑:程序博客网 时间:2024/05/24 03:06

 

先看下面类的定义 (编译通过):

 

 

再看这个类的定义(编译未通过):

 

 

后者错误的原意是,用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修饰的对象也能访问该函数。

原创粉丝点击