為什麼需要轉換運算子?
大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如
(int)
2.1f
;自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,
c++提供了轉換運算子過載函式
,它使得自定義類物件的強轉換成為可能。
轉換運算子的生命方式比較特別,方法如下:
operator
類名();
轉換運算子的過載函式是沒有返回型別的,它和類的建構函式,析構函式一樣是不遵循函式有返回型別的規定的,他們都沒有返回值。
下面我看乙個例子,看看它是如何工作的:
//例1
//站點:www.***ev-lab.com
#include <
iostream>
using
namespace std;
class test
test(test &temp)
~test()
operator
int()
//轉換運算子
public:
int a;
};
intmain()
在例子中我們利用轉換運算子將
test
類的物件強轉換成了
int型別並輸出,注意觀察轉換運算子函式的執行狀態,發現並沒有產生臨時物件,證明了它與普通函式並不相同,雖然它帶有
return
語句。
在很多情況下,類的強轉換運算子還可以作為類物件加運算過載函式使用,儘管他們的意義並不相同,下面的例子,就是利用轉換運算子,將兩個類物件轉換成
int後,相加並建立臨時類物件,後再賦給另乙個物件。
**如下:
//例2
//站點:www.***ev-lab.com
#include <
iostream>
using
namespace std;
class test
test(test &temp)
~test()
operator
int()
public:
int a;
};
intmain()
test(test &temp)
~test()
operator
int()
//轉換運算子,去掉則不會呼叫
public:
int a;
};
intmain()
test(test &temp)
~test()
test
operator +(test& temp2)
operator
int()
public:
int a;
};
intmain()
public
: int
a;
};
class
b
intra()
operator
a()//轉換運算子過載函式,他的作用則是將b類物件轉換成a類物件
protected
: int
a;
};
a::a(b &temp)
intmain
()
**中的
a at=a(bt);
執行正常,因為系統發現物件
at還未構造,所以優先選取了
a類的轉換建構函式處理了,沒有產生二義性問題。
但是**中的
tp(bt);
編譯錯誤,這是因為函式
tp的引數要求的是乙個
a類物件,而我們給他的則是乙個
b類物件,而在a類與
b類中都有乙個類似的操作,可以將
b類物件轉換成
a類物件,系統不知道是選取
a類的轉換建構函式進行構造處理,還是選擇
b類中的轉換運算符號過載函式處理,系統拒絕從他們兩個中選乙個,所以編譯錯誤。
我們修改
tp(bt)
為tp(a::a(bt));
編譯正常,因為我們顯式的明確的告訴系統應該使用
a類的轉換建構函式處理,所以,
顯式的告訴計算機應該如何處理資料,通常可以解決多義性問題。
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...