運算子過載和深淺拷貝

2022-07-16 04:18:13 字數 2955 閱讀 7417

對於某些運算符號(+,-,*,/....),我們不滿足與它原有的操作方式,而是要在對特有物件(如負數的加減)進行使用,但是編譯器會不允許這樣做,因為會與操作符原本的型別不匹配而導致操作失敗。因此我們需要對運算子進行過載,即賦予它新的意義,從而滿足我們的使用需求。

如complex_a和complex_b是兩個複數物件求兩個複數的和, 希望能直接寫:complexa + comple_b

運算子過載的目的是:擴充套件c++中提供的運算子的適用範圍,使之能作用於物件

 同乙個運算子,對不同型別的運算元,所發生的行為不同。

 對於複數物件:complex_a + complex_b   => 生成新的複數物件

 對於整數:5 + 4 = 9

運算子過載的實質是函式過載它可以過載為普通函式,也可以過載為成員,在對含有該運演算法的表示式轉換時,呼叫對應的運算子函式完成過載的操作。(依據引數的型別進行匹配)

1

class

complex

25 complex operator-(const complex &c); 6};

7 complex operator + ( const complex & a, const complex &b)

811 complex complex::operator-(const complex &c)

1215

//過載為成員函式時,引數個數為運算子目數減一。

16//

過載為普通函式時,引數個數為運算子目數。

17int

main()

18

有時候希望賦值運算子兩邊的型別可以不匹配,

比如,把乙個int型別變數賦值給乙個complex物件,

把乙個 char * 型別的字串賦值給乙個字串對

象,此時就需要過載賦值運算子「=」。

賦值運算子「=」只能過載為成員函式

1

class

string 27

const

char * c_str() ;

8 string & operator = (const

char *s);

9 string::~string( )

10};

11 string & string::operator = (const

char *s)

12 18

intmain()

1928

//輸出:

29//

good luck,

30//

shenzhou 8!

乙個字串的例子

1

string s1, s2;

2 s1 = 「this

」;3 s2 =「that」;

4 s1 = s2;

這幾句的含義很清楚,乙個s1串和s2串,並將s2賦值給s1,此時s1就和s2是一樣的值。。但是....這樣卻不是我們理解的那種copy

它是在將s2賦值給s1的時候,將原來指向s1的指標取指向s2

原本指向'this'字串的指標s1指向了'that'的字元空間,這樣原來的'this'的字元空間就找不到了(變成記憶體垃圾)。

這就是淺拷貝。此時若我們釋放s1所指向的儲存空間,將會釋放掉'that',但是繼續釋放s2時,會發生問題(程式崩潰),因為此刻s2指向的儲存空間已經被s1所釋放了

但是原來的'this'卻孤獨的無人問津,好慘 ...所以這樣是很不妥的。。。或者,我們更換此刻s1的值,又導致'that'被更換了。。。就會一團糟。。

所以需要對原來的'='號進行過載(深拷貝:生成乙個新的,值與當前的值一樣的,不同位址空間的複製,互相的操作不相往來的那種,即真正意義上的copy)

1

class

string 210

const

char *c_str() 11;

14 string & operator = (const

char *s)15;

21 ~string( )

2225 };

但是,這樣寫還是有一點小問題的。如果我寫了這個s=s,就問又有小問題。這樣在賦值時,左邊的s先被delete,然後將右邊s賦值給左邊的s,但是右邊的s已經沒了

啊?!?!?這樣就出錯了。所以**要繼續修改,成這樣

1 string & operator = (const string &s)

2

注意,返回值型別是string & 型這樣是為了對應原來 「=」運算子的左右兩邊型別

1//如

2 a = b =c;

3 (a=b)=c; //

會修改a的值4//

分別等價於:

5 a.operator= (b.operator=(c));

6 (a.operator=(b)).operator=(c);

現在應該可以了。

但是。。。。

1

//為 string類編寫複製建構函式的時候,會面臨和不過載的 = 同樣的問題,即預設建構函式會將=變成複製的操作,是淺拷貝!!所以我們用同樣的方法處理。寫個複製構造

2 string( string &s)

3

過載運算子,拷貝賦值運算子

一 過載運算子 在c語言當中遇到有很多的運算子,如 等等。如果我們用 對兩個物件進行判斷是否相等,系統就不樂意了,它不知道怎麼樣去判斷兩個物件是否相等?比如,我定義了乙個類,class a a obj1 a obj2 if obj1 obj2 錯誤,系統判斷不了 原因分析 系統遇到兩個物件之間的判斷...

拷貝建構函式和運算子過載

拷貝建構函式應用的場合由以下幾個方面 1 函式的引數是乙個物件,並且是值傳遞方式 2 函式的返回值是乙個物件,並且是值傳遞方式 3 用乙個物件初始化另外乙個物件 由此,當函式的引數或者返回值為乙個物件時,使用的時候要小心,因為值傳遞的時候執行的是位拷貝,並不會呼叫物件的建構函式,也就是說生成的臨時物...

c primer 拷貝控制和運算子過載

1.拷貝建構函式 作用 是指類的物件在建立的時候,能使用已有的物件之間初始化它。或者是在類的物件在作為函式形參的時候,或者類的物件在作為函式返回值的時候 作為複製的機制需要自動拷貝型別值。定義 class foo2.拷貝賦值運算子修改運算子的預設作用。定義 class test3.過載運算子 除了 ...