簡體   English   中英

為什么重載賦值運算符返回對類的引用?

[英]Why does overloaded assignment operator return reference to class?

class item {
public:
    item& operator=(const item &rh) {
        ...
        ...
        return *this;
    }
};

以下簽名是錯誤的嗎?

void operator=(const item &rh);

item a, b;
a = b; // equivalent to a.operator=(b); so there is no need to return this.

這不是“錯誤的”,而是令人驚訝的。 賦值評估目標對象。 這就是內置意義。 如果你為自己的班級定義不同,人們可能會感到困惑。

例:

int c;
while((c = getchar()) != EOF) {
  // ...
}

c的賦值返回c本身,然后將其與EOF進行比較。 用戶希望您的item類行為相似。

帶有void的簽名不允許鏈接賦值:

a = b = c;

(請查看Johannes關於基於返回指定值的賦值的使用模式的另一個示例的答案。)

這就是為什么不鼓勵使用這種簽名的原因。 但是,如果我沒有弄錯,你實際上可以使用這樣的簽名。

這完全合法。 但是當你聲明operator=類的時候,你將無法進行“賦值鏈”:

item a(X);
item b;
item c;
c = b = a;

引用允許修改返回值。 由於operator=從右到左進行評估,因此我向您展示的用法正在運行。

編輯此外,正如其他人所提到的,返回值通常用於像while (a = cin.get()) != 'q')這樣的表達式中。 但是你也可以聲明運算符如A operator=(const A&) (返回copy)或const A& operator(const A&) (返回const引用)。 我的觀點是:這個操作符可以返回任何內容 ,但慣用的方法是返回非const引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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