您的位置:首页 > 其它

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

2010-10-20 18:20 399 查看
先看下面类的定义 (编译通过):

class Hand
{
public:
Hand()
{
}
private:
vector<wstring> _fingers;
wstring			_color;
public:
const vector<wstring> & fingers() const { return _fingers; }
const wstring & color() const { return _color; }
};


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

class Hand
{
public:
Hand() : _number(10)
{
}
private:
int	_number;
public:
int & number() const { return _number; }
};


后者错误的原意是,用const修饰的成员函数内是不允许改变成员变量的值的,但是返回值是成员变量的引用,就可以通过返回值改变成员变量的值,这就使该const的修饰失去作用。比如定义一个const修饰的对象:const Hand myLeftHand; 就可以通过 myLeftHand.number() = 11;改变成员变量的值。

所以后者类的声明是错误的,编译不通过的。

但下面的声明是没问题的:

class Hand
{
public:
Hand() : _number(10)
{
}
private:
int	_number;
public:
int & number() { return _number; }
};


上面的声明,允许通过:

const Hand myLeftHand;

myLeftHand.number() = 11;

改变成员变量的值。

考虑下面情形,如果类A中含有vector成员,我们要通过该类向vector成员执行添加,删除等操作,该怎么办呢?

这就要用到上面的定义了,如下:

class Hand
{
public:
Hand()
{
}
private:
vector<rgb> _colors;
public:
vector & colors() { return _colors; }
//      const vector & colors() const { return _colors }
};


如果用 const vector & colors() const { return _colors; } 定义的话,就不能修改vector了,典型的就是不能调用push_back方法了。 但是去掉了const修饰的函数却不能被const修饰的对象调用,这怎么办? 答案是可以在上面的代码中去掉注释,使两者并存。也就是定义如下的类:

class Hand
{
public:
Hand()
{
}
private:
vector<rgb> _colors;
public:
vector & colors() { return _colors; }
//      const vector & colors() const { return _colors }
};


这与 “重载函数不能只是返回值不同” 并不冲突,因为后者多了const修饰函数,也是一种重载。

例如,下面的代码也正确:

class Hand
{
public:
Hand()
{
}
private:
vector<rgb> _colors;
public:
vector & colors() { return _colors; }
vector colors() const { return _colors }
};


补充:

const修饰的对象只能访问const修饰的成员函数,这就要求尽量使用const修饰成员函数,这样才能保证const修饰的对象也能访问该函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: