可能重复:
What is the meaning of a const at end of a member function?
亲爱的,
我试图重载运算符+ =并且我得到了一些“丢弃限定符”的错误,只是通过在方法的末尾添加“const”,我能够摆脱错误。有人能解释我为什么需要它吗?下面是代码。
class Vector{
public:
Vector();
Vector(int);
//int getLength();
int getLength() const;
const Vector & operator += (const Vector &);
~Vector();
private:
int m_nLength;
int * m_pData;
};
/*int Vector::getLength(){
return (this->m_nLength);
}*/
int Vector::getLength() const{
return (this->m_nLength);
}
const Vector & Vector::operator += (const Vector & refVector){
int newLength = this->getLength() + refVector.getLenth();
...
...
return (*this);
}
答案 0 :(得分:2)
+=
修改它的左手参数,当你为一个类重载它时,它是*this
。因此,您无法进行该参数const
。相反,使用
Vector &Vector::operator+=(const Vector &refVector);
话虽如此,因为它的右手参数必须是const
(根据定义),你不能在右手参数上调用非const
成员函数({{ 1}})。
答案 1 :(得分:2)
您在getLength
上呼叫refVector
,这是const Vector &
。您只能在const
引用上调用const
方法。
答案 2 :(得分:2)
operator+=
方法接收其参数作为引用常量,因此不允许修改它接收的对象的状态。
因此,通过引用到const(或指向const的指针),您可以只:
const
限定符的方法(表示此方法保证不会修改对象的内部状态),mutable
的可访问字段(这里很少使用且不相关)。希望有所帮助。
答案 3 :(得分:1)
operator+=
对refVector
采用const引用;你只能在const引用上调用const方法,所以getLength()
必须是const。
答案 4 :(得分:0)
您这样称呼refVector.getLength()
,refVector
被宣布为const Vector & refVector
,因此必须声明getLength
可以调用const
答案 5 :(得分:0)
operator+=
的实施需要const Vector&
,您可以将方法称为getLength()
。
但是,如果对象(或对其的引用)为getLength()
,则无法在const
对象上调用const
。
这就是为什么你在const
声明之后添加添加getLength()
的原因,以便可以在const
个对象上调用它。
答案 6 :(得分:0)
refVector
是const Vector&
,因此它只能从const
调用Vector
个成员函数。
方法末尾的const
表示该方法不会修改this
的内部状态,并允许将该方法称为const
个对象。
答案 7 :(得分:0)
在operator+=
中,refVector
是const
参数。这意味着该函数保证不会改变它,任何这样做的尝试都不会编译。
在函数声明后添加const
关键字可以保证该函数不会改变其接收者。换句话说,int getLength();
在理论上可以改变refVector
中的refVector.getLength();
。 int getLength() const;
保证不会。所以第一个不会编译,但第二个会编译。