[英]c++ two versions of overloading subscript operator
我的問題是關於:
const T& operator[](const int nIndex) const;
和:
T& operator[](const int nIndex);
為什么我需要在課堂上定義它們,目的是什么? 后者不足夠嗎?
在其末尾使用const
成員函數聲明允許甚至在const
對象上調用該const
。 這僅適用於不修改對象狀態的成員函數。
假設您重載這些運算符的類叫做X
據推測,它的行為有點像容器,通過此operator[]
可以訪問它包含的元素。
現在讓我們說用戶想要使用const X
:
const X x = /* fill it */;
use(x[0]);
是否允許用戶這樣做? 大概。 如果他們想要一個不可變的容器,那就讓他們擁有它。 如果你沒有提供operator[]
的const
版本,他們將無法做到這一點。 他們畢竟不是試圖修改容器,他們只是看着它的內容。
現在為什么使operator[]
的const
版本返回一個const
引用? 因為它必須。 它返回對類本身成員的引用。 如果容器是const
並返回非const
引用,則調用者只能使用此運算符修改其內部:
const X x = /* fill it */;
x[0].modify();
哦,親愛的,我們修改了x
的狀態,即使它是const
。 這將是糟糕的,事實上,編譯器甚至不會讓你這樣做。
這些是類的成員函數,將根據該類是否用作const
上下文來選擇版本。
當在const
上下文中的對象上使用[]
時,將調用此版本。 它保留了返回元素的const
。
const T& operator[](const int nIndex) const;
當在非const
對象上使用[]
時,將調用此版本。 它指定當你的對象不是const
,你將獲得一個你可以修改的元素,允許像myObject[0] = 10;
這樣的代碼myObject[0] = 10;
T& operator[](const int nIndex);
如果您要訪問的對象是const
,則不希望能夠修改它。 編譯器不允許您調用const
的非const
版本。
const vector<int> mints;
mints[3] = 5; // not allowed by compiler
第一個
const T&operator [](const int nIndex)const;
是一個常量方法(函數),即它保證它不會改變任何類成員變量(除非它是可變的)。
它還返回一個常量對象,這意味着你只能調用常量函數,即你只能調用末尾的const類似於上面的函數。
T&operator [](const int nIndex);
此方法可能會更改成員變量並返回可以調用任何類方法的對象。
我們需要它們,因為常量對象將使用常量方法而非常量將使用另一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.