c++賦值運算子過載,為什麼要返回引用?查了許多資料,基本有兩種說法:
一、c、c++賦值運算子的本意為「返回左值的引用」(左值:賦值號左面的變數而非其值)
可用以下程式段測試
int a,b=3,c=2;
(a=b)=c;
cout《對於x=y(x,y均為物件時),若不返回左值的引用,將會生成臨時物件。 如果不處理x=y=z這樣的表示式,也會正常(只是會呼叫拷貝建構函式和析構函式處理臨時物件)。
二、為了進行連續賦值,即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&) )。
所以也並非必須返回引用,返回引用的好處既可以於賦值的原始語義已知,又可避免拷貝建構函式和析構函式的呼叫。
以下程式中,可以去掉紅色部分的任一處,或全部去掉以做測試。
#include
#include
using namespace std;
class string
string(char *s)
string(const string
&s)string &operator=(const string &s)
~string()
friend ostream& operator<<(ostream& out,const string &s);
};ostream& operator<<(ostream& out,const string &s)
int main()
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 過載賦值運算子
c 類建立時,會產生乙個預設的賦值運算子函式 a operator const a 普通類例項之間賦值可能沒問題,但當類成員變數中有指標引用的動態記憶體時,複製後只是簡單地將指標值複製,而沒有將其指向的動態記憶體也拷貝乙份,這樣即多個類例項內的指標指向同一動態記憶體,當類例項析構時,會導致這塊動態記...
C 賦值運算子過載
不少知識點 在乙個類裡面沒有定義 過載 賦值運算子 時,那麼編譯器會生成乙個預設的賦值函式。它實現物件成員間的一一賦值,實現的是乙個淺拷貝 logic copy 當資料成員裡面如果有指標,則編譯器預設的賦值運算子不能滿足要求,會出現記憶體洩露。淺拷貝 通過物件之間的一一賦值,使得物件中的指標指向同一...