類型轉換符採用通用形式:
operator /*重載類型*/() {/*內容*/}
對任何可作為函數的傳回型別(除了void之外),都可以進行重載
不允許轉換為數組或函數類型,轉換為指標類型以及參考型別是可以的
operator int(Small Int& ); // error:nonmemberclass SmallInt{public:int operator int(); // error: return listoperator int(int = 0); // error:parameter list// ...};
這個例子中有三個錯誤
(1)轉換函式必須為成員函數
(2)類型轉換不能有形參
(3)類型轉換不能有傳回值
雖然轉換函式不能指定返回的類型,但是每個轉換函式必須顯示地返回一個指定的值
比如operator int() 返回int類型的值, operator sales_item() 返回sales_item類型的值
轉換操作符的使用:
class Interger {private:int data; public:Interger(int v) { data = v;}////重載賦值操作符 可以實現把int類型賦值賦給interger類型Interger& operator = (const int& v) {data = v;return *this; //返回Interger對象}//類型轉換操作符:在把interger類型賦值給int類型時 先會隱式地把interger類型轉為int類型 再賦給intergeroperator int() {return data;}//取資料int getData() {return data;}};
重載=: 可以實現(interger) a = (int) b
重載轉換符int: 當(int) b = (interger) a 時, 先會把賦值符右邊的a從interger轉為int,再把a賦值給b
重載int就實現了兩個變數之間的賦值
int main() {int a = 0;Interger b(10);b = a;cout << b.getData() << endl;system("PAUSE");return 0;}
再來看一個特殊的例子:
#include <iostream> #include <cmath> using namespace std; class Complex { private: double real; double imag; public: // 預設建構函式 Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {} // 求複數的絕對值 double mag() { return getMag(); } // 轉換操作符 operator double () { return getMag(); } private: // get magnitude double getMag() { return sqrt(real * real + imag * imag); } }; int main() { // 定義一個複數對象 Complex com(3.0, 4.0); // 列印magnitude,可以使用下面的兩種方法 //方法1 cout << com.mag() << endl; //方法2 cout << com << endl; }
這裡的方法2為什麼也會顯示和方法1一樣的內容呢
com是一個Complex類型, cout<<com<<endl是不被允許的
但重載轉換操作符double後 com會先從Complex型轉為double類型 再被輸出資料流輸出
但是應該避免方法2,方法2容易出錯.