C 運算子過載 8 預設賦值操作符和引用

2021-07-02 20:29:07 字數 1283 閱讀 6359

前面的一篇文章已經討論過了賦值操作符過載的問題,參考c++運算子過載(3)。

本篇文章是前一篇的擴充套件。在前面的這篇文章中,已經說過了什麼時候當沒有使用者定義的賦值操作符時,編譯器會生成乙個預設的賦值操作符執行淺拷貝,這會導致一些問題。當乙個類中使用了引用但沒有定義賦值操作符,會導致什麼問題呢?

參考下面程式。

#includeusing namespace std;

class test

void print()

void setx(int i)

};int main()

編譯失敗。輸出下面資訊。

gcc4.8.5 + centos7.2:

error: use of deleted function 'test& test::operator=(const test&)'

t2 = t1;

error: non-static reference member 'int& test::ref', can't use default assignment operator

visual studio 2015:

error: non-static reference member 'int& test::ref', can't use default assignment operator

message : 編譯器已在此處生成「test::operator =」

message : 「test &test::operator =(const test &)」: 由於「test」具有引用型別的資料成員「test::ref」,因此已隱式刪除函式

message : 參見「test::ref」的宣告

在下面的這些情況下,編譯器不會自動建立預設賦值操作符:

1. 類中包含const或volatile型別的非靜態資料成員。

2. 類中包含乙個非靜態的資料成員,並且其型別是不能賦值的(例如引用)。

3. 被繼承的基類中不能使用賦值操作符(例如基類中包含引用型別的成員)。

只要上面的某個條件成立,則使用者必須自定義賦值操作符。

例如,當在上述**中加入乙個賦值操作符函式後,程式可以正常執行。

#includeusing namespace std;

class test

void print()

void setx(int i)

test& operator = (const test& t)

};int main()

執行結果: 10

C 運算子過載賦值運算子

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

C 運算子過載 2 拷貝構造vs賦值操作符

include includeusing namespace std class test test const test t test operator const test t int main 執行結果 assignment operator called copy constructor c...

C 過載賦值操作符

類過載賦值操作符一般都是作為成員函式而存在的,那函式應該返回什麼型別呢?參考內建型別的賦值操作,例如 int x,y,z x y z 15 賦值行為相當於x y z 15 也就是賦值操作應該返回左運算元的引用,因此,為了和內建型別相容,類中過載賦值操作符應該返回左運算元的引用,即 this,如下類a...