說明: c++允許程式設計師指定類之間進行轉換的方式(含基本型別)
站在類的角度看問題,姑且分為「當前類」 和 「其他類」
假設: 當前類是程式設計師定義的,其他類既可以是程式設計師定義的,也可以是c++內建的基本型別
方式: 通過定義 「轉化函式」
轉化函式:
本質: 允許只傳入乙個實參的建構函式
包括:1. 只接受乙個引數的建構函式
2. 具有多個形參,但是在類的宣告中,存在乙個引數沒有預設值,但是其他行參都有預設
值的建構函式
那麼,這裡的 「其他類」 指的就是那個在類宣告中沒有設定預設值的型別,或者能夠與這個型別自動轉換的型別
有了轉換函式之後呢,我們可以通過自動地將這個 「其他類」 的物件轉換為 「當前類」 的物件
舉乙個例子,實現了內建型別 int (「其他類」) 到student類 (「當前類」) 的轉換
#include using namespace std;
class student
student(int id)
};int main()
再舉乙個例子
(double 和 int 型別是可以互相自動轉換)
#include #include using namespace std;
class student
student(int id , string name="")
};int main()
「當前類」 轉化為 「其他類」 就稍微麻煩點。因為,它的 「轉換函式」 不是建構函式--需要額外定義
形式: operator typename();
要求: 1. 成員函式
2. 不能指定返回型別 (即使如此,在實現時,你必須返回乙個typename型別的變數)
3. 不能有引數 (其實有乙個預設的引數--指向當前物件的this指標)
乙個例子
#include using namespace std;
class student
student(int id)
operator int()
};int main()
在上面這段**中,含有語句 「cout << student << endl;」
為什麼沒有為 student類 過載輸出操作符函式,而編譯器卻沒有報錯呢?
因為,在輸出的時候,student物件student被自動轉化為int型別的變數。而身為ostream物件的cout自然能處理int型別的變數
目前講到的,「當前類」轉換為「其他類」的例子裡面,都是隱式型別轉換,我們可以通過使用強制型別轉換來使 「當前類」 轉換為 「其他類」。
當然,在強制轉換之前,我們也要像上面一樣定義轉換函式。
強制型別轉換的句式我們也很熟悉了-- typename (variable) 或 (typename) variable
1. 過載雙目運算子時,定義為友元可以讓程式更容易適應自動型別轉換---兩個運算元都成為了函式
引數,因此與函式原型匹配 (就是有轉換函式的意思)
因為,如果運算元的型別不是當前類的型別,它可以通過 「轉換函式」 轉換為當前類的物件,再調
用過載的運算子函式。
2. 自動轉換的隱式轉換,有時候會帶來一些難以發現的問題。為了保險,可以使用顯式轉換,比如
通過 explicit 來限定轉換函式。
[1]《c++ primer plus 6th edition》
C 類的自動轉換
類的自動轉換 說明 c 允許程式設計師指定類之間進行轉換的方式 含基本型別 站在類的角度看問題,姑且分為 當前類 和 其他類 假設 當前類是程式設計師定義的,其他類既可以是程式設計師定義的,也可以是c 內建的基本型別 方式 通過定義 轉化函式 1.其他類轉換為當前類 轉化函式 本質 允許只傳入乙個實...
類的自動轉換和強制型別轉換
內建型別轉換 將乙個標準型別變數的值賦給另乙個標準型別的變數時,如果這兩種型別相容,則c 自動將這個值轉變為接收變數的型別。eg long cout 8 int型的8將被轉換為long double time 11 int型的11將被轉換為double int side 3.33 double型別的...
類的自動型別轉換和強制型別轉換
1.可以將類定義成與基本型別或者另乙個類相關,使得從乙個類轉換成另外乙個型別是有意義的。2.將基本型別轉換成類 下面以double轉換成money類來舉例 假設定義了如下類 class money 則其中的建構函式money double r 可以講double型別轉換成money類這個型別。只有接...