簡體   English   中英

c ++兩個版本的重載下標運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM