在C++中,我看到了這段代碼。與const重複相同的方法?
public:
Ports& GetPorts();
const Ports& GetPorts() const;
爲什麼需要使用const的另一種方法? 編譯器如何決定調用哪個方法?
在C++中,我看到了這段代碼。與const重複相同的方法?
public:
Ports& GetPorts();
const Ports& GetPorts() const;
爲什麼需要使用const的另一種方法? 編譯器如何決定調用哪個方法?
如果您致電x.GetPorts()
而x
是非const
對象,則將調用第一個版本。如果x
是const
對象,則另一方面將調用第二個版本。這種代碼說:「如果對象是可修改的,則允許修改GetPorts()
的結果;如果對象是const
,則不要修改結果。」如果匹配,編譯器會首選第一個版本;但是,如果對象是const
,則它不會出現,因此將使用第二個版本。
因爲第一個重載不是const方法,所以不能通過臨時對象和const對象調用它。如果你提供了一個const超載,你基本上支持const對象。
編譯器將對const對象使用const重載,非const對象使用非const重載。
如果你的函數是const,通常不需要提供重載,因爲const函數的安全性如下:它們適用於const對象和非const對象。
只有當你想對const和非const對象有不同的行爲時,這是必須的。否則第二個版本就足夠了。一個設計決定。
行爲可能相同。通常這些功能只有不同的返回類型。 – UncleBens 2011-03-09 15:56:23
@UncleBens:當然,如果他們返回不同的東西,他們是不同的。那麼你需要兩個,否則不需要。如果你沒有返回一個可修改的對類成員的引用,你可以避免很多這樣的情況, – 2011-03-09 16:03:43