2010-11-12 132 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;保證不會。所以第一個不會編譯,但第二個會。

相關問題