C 學習筆記之 類的自動轉換

2022-07-29 14:45:17 字數 2069 閱讀 2385

參考自《c++ primer plus 6th edition》

類的自動轉換:

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

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

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

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

1. 其他類轉換為當前類

轉化函式:

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

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

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

值的建構函式

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

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

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

#include using

namespace

std;

class

student

student(

intid)

};int

main()

view code

再舉乙個例子 

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

#include #include 

using

namespace

std;

class

student

student(

int id , string name=""

) };

intmain()

view code

2. 當前類轉化為其他類

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

形式:  operator typename();

要求:    1. 成員函式

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

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

乙個例子

#include using

namespace

std;

class

student

student(

intid)

operator

int()

};int

main()

view code

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

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

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

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

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

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

一些好的程式設計習慣:

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

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

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

用過載的運算子函式。

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

通過 explicit 來限定轉換函式。

C 之類的自動轉換和強制型別轉換

1.自動轉換 c 語言不自動轉換不相容的型別,例如,下面的語句 int p 10 是非法的,因為左邊是指標型別,而右邊是數字。不過在無法自動轉換時,可以使用強制型別轉換 int p int 10 上述語句將10強制轉換為int指標型別,將指標設定為位址10.c 程式設計師可以指示c 如何自動進行轉換...

c 學習筆記之類的應用

類是c 的靈魂,以前光學c語言了,一直覺得c 和c沒什麼區別,今天接觸了c 的類才知道c 使程式多麼的簡潔高效。類是多麼的重要,才感覺到前面學的c 不僅僅是對c的複習與鞏固。所以學什麼東西一定要堅持,今天是堅持打卡的第十天,加油!希望自己未來成為一名優秀的工程師。加油各位,另外也要注重保護自己的身體...

C 學習筆記之 類 物件

類是描述具有相同特徵和行為的抽象。物件是類的例項。類的作用就是分類!class關鍵字 class 類名 1 字段 類的共有屬性class car比如以上的brand,price,displacement 簡單的應用 using system namespace lesson12 class main...