參考自《c++ primer plus 6th edition》
類的自動轉換:
說明: c++允許程式設計師指定類之間進行轉換的方式(含基本型別)
站在類的角度看問題,姑且分為「當前類」 和 「其他類」
假設: 當前類是程式設計師定義的,其他類既可以是程式設計師定義的,也可以是c++內建的基本型別
方式: 通過定義 「轉化函式」
1. 其他類轉換為當前類
轉化函式:
本質: 允許只傳入乙個實參的建構函式
包括:1. 只接受乙個引數的建構函式
2. 具有多個形參,但是在類的宣告中,存在乙個引數沒有預設值,但是其他行參都有預設
值的建構函式
那麼,這裡的 「其他類」 指的就是那個在類宣告中沒有設定預設值的型別,或者能夠與這個型別自動轉換的型別
有了轉換函式之後呢,我們可以通過自動地將這個 「其他類」 的物件轉換為 「當前類」 的物件
舉乙個例子,實現了內建型別 int (「其他類」) 到student類 (「當前類」) 的轉換
#include usingview codenamespace
std;
class
student
student(
intid)
};int
main()
再舉乙個例子
(double 和 int 型別是可以互相自動轉換)
#include #includeview codeusing
namespace
std;
class
student
student(
int id , string name=""
) };
intmain()
2. 當前類轉化為其他類
「當前類」 轉化為 「其他類」 就稍微麻煩點。因為,它的 「轉換函式」 不是建構函式--需要額外定義
形式: operator typename();
要求: 1. 成員函式
2. 不能指定返回型別 (即使如此,在實現時,你必須返回乙個typename型別的變數)
3. 不能有引數 (其實有乙個預設的引數--指向當前物件的this指標)
乙個例子
#include usingview codenamespace
std;
class
student
student(
intid)
operator
int()
};int
main()
在上面這段**中,含有語句 「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...