運算子函式過載的返回值型別問題,c中為什麼賦值運算子過載返回型別是引用

2021-03-03 21:28:38 字數 2324 閱讀 7794

1樓:陝西u就業

引數型別

: 大家都bai知道運算子du

過載函式的引數類zhi型必須是引用型別,這dao是為什麼呢。內拿我們最常用的賦值運

容算符過載來說,如果引數型別不是引用型別,那麼傳參時就需要乙個物件的副本,將實參複製到形參,這種複製是淺複製,並不會為形參分配記憶體空間,這就導致如果類中有指標型別,形參和實參的指標就指向同一塊記憶體,再呼叫析構函式時就會出錯。

返回值型別:

同理返回值型別也要是引用型別,因為呼叫賦值運算子過載函式時也會建立引數物件的副本,此時也是淺複製,函式返回物件與呼叫函式的物件指向同一塊記憶體,呼叫析構函式時會出錯。如果使用引用型別,則函式返回物件與呼叫函式的物件共用相同的儲存空間(共用儲存空間與成員指標指向同一塊記憶體是不一樣的),這樣就不會再執行返回物件的析構函式,因而不會再出錯。

c++中為什麼賦值運算子過載返回型別是引用

2樓:可以叫我表哥

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

例dao:

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&) )。

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

3樓:難得當歌對酒時

因為賦值操作會改變

bai左值,du而 + 之類的運算子不會改變操作zhi數,所以說賦dao值運算子過載要返回引

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

4樓:匿名使用者

不要一定非要是引用的,用引用是為了可以寫a+b+c這樣的連續表示式

返回的不是引用或指標則只能用於賦值

5樓:

這只是個協copy議,適用於所有賦值相bai關運算子,所有內建型別和標準庫du型別都這樣遵循,具zhi體可參考daoeffective c++ 第三版 條款10 令 operator= 返回乙個 reference to *this

6樓:再聯絡

markmarkmarkmark

下標運算子過載函式若判定越界了,返回值為啥要定義為靜態的

7樓:幻形術

因為返回值型別是char&也就是引用,因變數生命週期的問題,不能返回區域性臨時變數,所以只能是靜態變數或者全域性變數。

類外定義運算子過載函式時為什麼雙寫類名

8樓:匿名使用者

這個不叫類外定義,這個是類成員函式operator+的實現,***plex::只是指定了成員函式所屬類名。

類外定義的運算子過載是類似於:

***plex& operator<<(***plex &c1, ***plex &c2)

這樣。因為類外函式沒有this指標,所以要寫兩個引數,c1為運算子左邊的引數。

特別的:

如果類外運算子函式要訪問類中非public成員,在類中要將類外函式宣告為友元函式

9樓:匿名使用者

第乙個***plex表示函式的返回型別::前邊的***plex表示函式是類***plex裡的乙個函式

10樓:匿名使用者

類外的時候,***plex::operator的***plex表示這個方法屬於***plex這個類在類裡面的時候自然就沒有必要了

DevC 過載賦值運算子後型別不匹配的問題

vc 6.0編譯通過 不過確實有個地方有點不妥,加個 試試?需要復 你過載,不能直接用製,sample是你自己定義的類,運算子要自己過載,直接用 是不行的 ps 這次是我錯了,我沒注意看 我只是給複製過去編譯了一下。dev c 是編譯通過不了,你按照lcability說的改下試試。vc6編譯正常能使...

c 操作符過載問題,C 運算子過載是什麼意思

p13 p11 12不能過得原因是 operator 返回的是臨時變數,而你opertor 操作需要的是引用變數。會讓編譯器找不到需要的operator 操作。建議在operator 引數上加上const。或者讓operator 操作返回引用即可。這個錯誤的意思是 在乙個加了const限定符的成員函...

為什麼賦值運算子只能作為成員函式進行過載,而不能作為友元函式

因為編譯器會提供乙個預設的賦值運算子,你如果把自己定義賦值運算子的寫成友元的話,函式的引數列表不一樣,不會發生過載 所以編譯器禁止了這種行為。c 規定 這四個運算子只能被過載為類的非靜態成員函式,其他 的可以被友元過載版,主要權是因為其他的運算子過載函式都會根據引數型別或數目進行精確匹配,這四個不具...