C 類的自動轉換

2021-07-13 21:44:14 字數 1398 閱讀 5439

類的自動轉換:

說明:    c++允許程式設計師指定類之間進行轉換的方式(含基本型別)

站在類的角度看問題,姑且分為「當前類」 和 「其他類」 

假設:    當前類是程式設計師定義的,其他類既可以是程式設計師定義的,也可以是c++內建的基本型別

方式:    通過定義 「轉化函式」

1. 其他類轉換為當前類

轉化函式:

本質: 允許只傳入乙個實參的建構函式

包括:1. 只接受乙個引數的建構函式

2. 具有多個形參,但是在類的宣告中,存在乙個引數沒有預設值,但是其他行參都有預設

值的建構函式

那麼,這裡的 「其他類」 指的就是那個在類宣告中沒有設定預設值的型別,或者能夠與這個型別自動轉換的型別

有了轉換函式之後呢,我們可以通過自動地將這個 「其他類」 的物件轉換為 「當前類」 的物件 

舉乙個例子,實現了內建型別 int (「其他類」) 到student類 (「當前類」) 的轉換

再舉乙個例子 

(double 和 int 型別是可以互相自動轉換)

2. 當前類轉化為其他類

「當前類」 轉化為 「其他類」 就稍微麻煩點。因為,它的 「轉換函式」 不是建構函式--需要額外定義

形式:  operator typename();

要求:    1. 成員函式

2. 不能指定返回型別      (即使如此,在實現時,你必須返回乙個typename型別的變數)

3. 不能有引數       (其實有乙個預設的引數--指向當前物件的this指標)

乙個例子

在上面這段**中,含有語句 「cout << student << endl;」

為什麼沒有為 student類 過載輸出操作符函式,而編譯器卻沒有報錯呢?

因為,在輸出的時候,student物件student被自動轉化為int型別的變數。而身為ostream物件的cout自然能處理int型別的變數

目前講到的,「當前類」轉換為「其他類」的例子裡面,都是隱式型別轉換,我們可以通過使用強制型別轉換來使 「當前類」 轉換為 「其他類」。

當然,在強制轉換之前,我們也要像上面一樣定義轉換函式。

強制型別轉換的句式我們也很熟悉了-- typename (variable)  或  (typename) variable

一些好的程式設計習慣:

1. 過載雙目運算子時,定義為友元可以讓程式更容易適應自動型別轉換---兩個運算元都成為了函式

引數,因此與函式原型匹配 (就是有轉換函式的意思)

因為,如果運算元的型別不是當前類的型別,它可以通過 「轉換函式」 轉換為當前類的物件,再調

用過載的運算子函式。

2. 自動轉換的隱式轉換,有時候會帶來一些難以發現的問題。為了保險,可以使用顯式轉換,比如

通過 explicit 來限定轉換函式。

類的自動轉換

說明 c 允許程式設計師指定類之間進行轉換的方式 含基本型別 站在類的角度看問題,姑且分為 當前類 和 其他類 假設 當前類是程式設計師定義的,其他類既可以是程式設計師定義的,也可以是c 內建的基本型別 方式 通過定義 轉化函式 轉化函式 本質 允許只傳入乙個實參的建構函式 包括 1.只接受乙個引數...

c 類的自動型別轉換和強制型別轉換

下面討論類的型別轉換。我們先來看看c 是如何處理內建型別轉換的。將乙個標準型別變數的值賦給另一種標準型別的變數時,如果這兩種型別相容,則c 自動將這個值轉換為接受變數的型別。double time 11 int value 11 converted to type double利用建構函式將內建型別...

類的自動轉化和強制型別轉換(C )

可以將類定義成與基本型別或另乙個類相關,使得從一種型別轉換為另一種型別是有意義的。當乙個類的建構函式中,有只有接受乙個引數的建構函式,這個建構函式就能作為轉換函式。pragma once ifndef stonewt h define stonewt h class stonewt int ston...