對於某些運算符號(+,-,*,/....),我們不滿足與它原有的操作方式,而是要在對特有物件(如負數的加減)進行使用,但是編譯器會不允許這樣做,因為會與操作符原本的型別不匹配而導致操作失敗。因此我們需要對運算子進行過載,即賦予它新的意義,從而滿足我們的使用需求。
如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這幾句的含義很清楚,乙個s1串和s2串,並將s2賦值給s1,此時s1就和s2是一樣的值。。但是....這樣卻不是我們理解的那種copystring s1, s2;
2 s1 = 「this
」;3 s2 =「that」;
4 s1 = s2;
它是在將s2賦值給s1的時候,將原來指向s1的指標取指向s2
原本指向'this'字串的指標s1指向了'that'的字元空間,這樣原來的'this'的字元空間就找不到了(變成記憶體垃圾)。
這就是淺拷貝。此時若我們釋放s1所指向的儲存空間,將會釋放掉'that',但是繼續釋放s2時,會發生問題(程式崩潰),因為此刻s2指向的儲存空間已經被s1所釋放了
但是原來的'this'卻孤獨的無人問津,好慘 ...所以這樣是很不妥的。。。或者,我們更換此刻s1的值,又導致'that'被更換了。。。就會一團糟。。
所以需要對原來的'='號進行過載(深拷貝:生成乙個新的,值與當前的值一樣的,不同位址空間的複製,互相的操作不相往來的那種,即真正意義上的copy)
1但是,這樣寫還是有一點小問題的。如果我寫了這個s=s,就問又有小問題。這樣在賦值時,左邊的s先被delete,然後將右邊s賦值給左邊的s,但是右邊的s已經沒了class
string 210
const
char *c_str() 11;
14 string & operator = (const
char *s)15;
21 ~string( )
2225 };
啊?!?!?這樣就出錯了。所以**要繼續修改,成這樣
1 string & operator = (const string &s)注意,返回值型別是string & 型這樣是為了對應原來 「=」運算子的左右兩邊型別2
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.過載運算子 除了 ...