類的自動轉換

2021-07-04 09:02:07 字數 1807 閱讀 1397

說明:    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類這個型別。只有接...