2010-11-12 133 views
3

可能重复:
What is the meaning of a const at end of a member function?运算符+ =重载,为什么是const?

亲爱的朋友们,

我试图使用操作符重载+ =和我得到的 “丢弃预选赛” 的一些错误,只能通过在方法的末尾添加“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); 
} 
+2

请注意,如果不需要更改状态,则使成员函数为'const'总是一个好主意。 – 2010-11-12 13:11:17

+0

投票将其作为副本关闭。基本上,它在[成员函数结束时的const是什么意思?](http://stackoverflow.com/questions/4059932/what-is-the-meaning-of-a-const-at - 成员函数的终结)(我现在标记为[C++ - FAQ](http://stackoverflow.com/questions/tagged/c%2b%2b-faq),所以它会更容易找到)。 – sbi 2010-11-12 13:21:08

+0

感谢您的建议! – Javier 2010-11-12 13:28:20

回答

2

operator+=方法接收其参数作为参考常量,因此不允许修改其接收的对象的状态。

因此,通过参考给const(或指针给const)只可以:

  • 读取的可用的字段在该物体(未写),
  • 呼叫只使用const限定符(表示此方法保证不修改对象的内部状态)的方法,
  • 读取或写入可访问的字段,声明为mutable(这在这里很少使用且不相关)。

希望有帮助。

2

+=修改其左侧参数,这是*this当重载它的一类。因此,你不能使这个参数const。相反,使用

Vector &Vector::operator+=(const Vector &refVector); 

话虽这么说,是因为它的右边参数必须是const(定义),你不能说在右边的参数(refVector)非const成员函数。

+0

但这并不是为什么'getLength'必须是一个const方法。这是'refVector.getLength'这就是问题所在。 – 2010-11-12 13:10:23

+0

@Peter Milley,我正在那样做。 – 2010-11-12 13:11:21

+0

好的,谢谢!顺便说一句,如果我应该删除第一次出现的“const”,以便具有:Vector&Vector :: operator + =(const Vector&refVector); 为什么我在某些情况下会在重载“operator =”时看到一个const参数,如果我们需要修改左边的参数,例如:const Vector&Vector :: operator =(const Vector&right) – Javier 2010-11-12 13:25:44

2

你打电话getLengthrefVector,这是一个const Vector &。您只能在const参考号上拨打const方法。

+0

感谢您的解释! – Javier 2010-11-12 13:27:46

0

要调用它像这样refVector.getLength(),并refVector声明const Vector & refVector,所以getLength都将被声明为确定在const调用。

1

operator+=refVector采取常量引用;你只允许在const引用上调用const方法,所以getLength()必须是const。

0

您的operator+=的实施需要一个const Vector&,您将其称为方法getLength()

但是,你不能叫getLength()一个const对象,如果对象(或对它的引用)是const

这就是为什么你添加const之后getLength()声明,以至于说即使在const对象上也可以调用它。

0

refVectorconst Vector&,所以它只能从Vector调用const成员函数。

const在方法结束时表示该方法不会修改的this内部状态,并且允许被称为BE const对象方法。

0

operator+=,refVectorconst参数。这意味着函数保证不会改变它,并且任何尝试这样做都不会编译。

在函数声明后添加const关键字可以保证函数不会改变它的接收者。换句话说,int getLength();理论上可以在refVector.getLength();中改变refVectorint getLength() const;保证不会。所以第一个不会编译,但第二个会。

相关问题