簡體   English   中英

c++ 中的重載復制賦值運算符

[英]Overloading copy assignment operator in c++

我對重載的復制賦值運算符有疑問。 我在許多書籍/網站中讀到,重載復制賦值運算符的簽名如下所示:

類型 &Type::operator=(const 類型 &rhs)

但是,我不明白為什么我們需要通過引用返回它,實際上不返回沒有意義嗎? 我的意思是當我們通過引用或值返回它時,返回值在哪里返回,因為另一個 object 已經在重載的復制分配運算符中分配了例如。 如果我的主要 function 中有這樣的東西:

int main(){
 Type a {<Some lieral value>}; //Initialise object a with some literal
 Type b {<Some literal value>}; 
 b=a; //Object b is already assigned when we call overloaded copy operator, which variable accepts the return value?
}

注意:這本書/網站說了一些關於鏈分配的內容,但是我不明白當我們遇到上述情況時值將返回到哪里。

Type b = a;

不是賦值。 Is 是一個帶初始化的變量定義,並導致Type的復制構造函數a as 參數調用。 構造函數沒有返回值,正如您正確指出的那樣, Type b = a具有任何結果值是沒有意義的,因為它甚至不是表達式。

然而

b = a;

(與先前Type B; )分配。 賦值是一個表達式,所以它有一個可以在其他表達式中使用的結果值。 例如以下是有效的:

int a = 0;

(a = 2) += 1;

並將a設置為3 這里對於int等基本類型,賦值返回對賦值左側的引用。

對於 class 類型,這是通過讓復制賦值運算符也返回對賦值左側的引用(即*this )來模仿的。

一個典型的用例是分配給多個實例:

Type a, b, c;
// Do something with c
a = b = c;

在最后一行之后,所有三個abc將在相同的 state 中, c在更改分配之前,因為a = (b = c);表達式被解析為右側賦值返回對b的引用,該引用用於在將c分配給b之后分配給a

不需要從重載的賦值運算符返回對*this的引用。 但是,這樣做是約定俗成的,因為它啟用了這個特定的用例。 如果您不返回對*this的引用,您的 class 的用戶可能會在該習語突然不適用於您的 class 時感到驚訝,即使它可能不經常使用。

不需要使用從 function(或運算符)返回的值。 如果你寫

b = a;

返回的引用被簡單地丟棄。 它永遠不會存儲在任何地方,這根本不是問題。

暫無
暫無

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

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