2011-05-26 104 views
2

我想寫一個與std :: set兼容的類,所以我重載了像這樣的「少於」運算符。有用。'const Obj'和'Obj&'有什麼關係?

bool Segment::SVertex::operator<(const SVertex &rhs) const 
{ 
    return id < rhs.id; 
} 

但是,由於我寫Java比C++多,'rhs.id'對我來說看起來很不舒服。所以我將其更改爲「rhs.getId()」,其中的getId()僅僅是一個正常的getter函數:

long SVertex::getId(){return id;} 

這原來是一個編譯時錯誤:無法從轉換「這個」指針「常量段:: SVertex」到‘段:: SVertex &’

(請注意,我的VS2008是不是英語,我翻譯的錯誤信息,所以上面的行不一定確切)

我只知道'&'表示通過引用傳遞,'const'禁止任何更改。我不完全瞭解幕後發生的事情。

回答

7

問題是你的getter函數不完全是'正常';你吸氣應該

long SVertex::getId() const 
{return id;} 

注意常量結尾:它告訴編譯器/用戶,這種方法不會修改類的內部。因此,可以在您的運營商<中使用它,這也是常量。 如果Const成員函數也是const,則它只能調用其他成員函數;非const成員函數可以調用任何。

+0

謝謝!這真的不是正常的哈哈!我應該改變我認爲從編寫數千行Java代碼形成的方式。我的錯。 – fwonce 2011-05-26 15:08:01

5

你消氣必須是恆定的:

long SVertex::getId() const {return id;} 

這標誌着它不會改變對象。

+1

我明白了,所以在螺母,所有功能都必須是const這是由一個const函數調用。 – fwonce 2011-05-26 15:02:12

+0

是的。你可以將每個成員函數想象成具有不可見的第一個參數'SVertex * this'。 @unwind顯示的語法是你如何聲明'const SVertex * this'這個參數。 – Nemo 2011-05-26 15:07:34

2

你的rhsconst,所以你不允許改變它。在另一方面你getId沒有承諾不改變this - 它也需要是const:

int SVertex::getId() const { return id; } 
相關問題