c 賦值運算子為什麼要返回引用

2021-07-10 07:22:02 字數 713 閱讀 2897

一、c/c++賦值運算子的本意為「返回左值的引用」(左值:賦值號左面的變數而非其值)

例:int a, b = 3, c = 2;

(a = b) = c;

cout<

對於a = b(a,b均為物件時),若不返回左值的引用,將會生成臨時物件。如果不處理a = b = c這樣的表示式,也會正常(只是會呼叫拷貝建構函式和析構函式處理臨時物件)。

二、為了進行連續賦值,即 x = y = z

1、賦值返回引用

x = y = z 先執行y = z,返回y的引用,執行x = y

2、賦值不返回引用

x = y = z 先執行y = z,返回用y初始化的臨時物件(注意臨時物件都是常物件),再執行x = y的臨時物件(要求operator=(const x&)  ),返回用x初始化的臨時物件(此處要求拷貝建構函式必須為x(const x&) )。

所以也並非必須返回引用,返回引用的好處既可以於賦值的原始語義已知,又可避免拷貝建構函式和析構函式的呼叫。

因為賦值操作會改變左值,而 + 之類的運算子不會改變運算元,所以說賦值運算子過載要返回引用以用於類似 (a=b)=c 這樣的再次對a=b進行寫操作的表示式。+ 返回乙個臨時物件是合情合理的 ,你若返回引用大多數情況下也不會出錯或導致某個運算元被意外修改,但這就使(a+b)=c這樣的表示式可以出現,這就有點不符合約定了,當然,你也可以讓 + 返回乙個常引用。臨時物件不允許更改。

c 中有些過載運算子為什麼要返回引用

事實上,我們的過載運算子返回void 返回物件本身 返回物件引用都是可以的,並不是說一定要返回乙個引用,只不過在不同的情況下需要不同的返回值。那麼什麼情況下要返回物件的引用呢?原因有兩個 1.允許進行連續賦值 2.防止返回物件 返回物件也可以進行連續賦值 常規的情況,如a b c,而不是 a b c...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 賦值運算子

using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 0219 賦值運算子 執行結果 x 11 x 2的運算結果...