C 學習筆記(13) 類的型別轉換

2021-09-02 18:51:19 字數 2168 閱讀 3913

c++的某些型別之間可以進行轉換,如int轉double,double轉int等等。而我們自定義的類(作為型別來看)也是可以進行轉換的。本篇筆記將總結c++類的型別轉換問題。

一、型別轉換

可以將類定義成與基本型別或另乙個類相關,使得從一種型別轉換為另一種型別是有意義的。在這種情況下,程式設計師可以指示c++如何自動進行轉換,或通過強制型別轉換來完成。

首先舉個栗子:設計乙個表達時間的類,在某些實際應用系統中,為了方便於設計通訊資料協議,通常會用分或秒來表示時間。如200minutes,實際上它表示的時間在常用格式上是3h20m。於是將該類設計為如下的方式:

class time

;#endif

上面的建構函式有三個,除了有預設建構函式外,有乙個只有乙個引數的建構函式:time(int minutes);它使得我們可以如此定義乙個time類的物件:

time mytime(200);

也可以:

time mytime;

mytime = 200;

這時,程式也將呼叫time(int minutes)這個建構函式來建立乙個臨時的time的物件。這從表面看來是將乙個int型的資料轉化為了time型別的資料,所以被稱作型別轉換。

二、自動轉換(隱式轉換)

上述的方法表明在c++中,只有乙個引數的建構函式將可以實現型別的自動轉換。這種轉換是隱式轉換。如上述time類的time(int hours, int minutes)建構函式因為有兩個引數,因此它不具備轉換功能。如果給第二個引數乙個預設值:time(int hours, int minutes=0),它便具有了轉換功能。

但是某些情況下,程式設計師並不希望類完成自動轉換。如輸入是200h而非200minutes,則用帶轉換功能的建構函式自動轉換會發生問題。於是c++提供了explicit關鍵字來修飾某些建構函式,使得它們不能隱式(自動)轉換。但是,用explicit關鍵字修飾的建構函式仍然可以用顯示轉換的方式完成型別轉換。

三、強制轉換(顯式轉換)

不冷建構函式有沒有explicit關鍵字修飾,我們都可以在有單個引數建構函式的前提下,實現強制型別轉換,這種轉換需要顯式的表達要轉換的型別:

time mytime;

mytime = 200;   //編譯器將報錯

mytime = (time)200;      //正確

mytime = time(200);      //正確

這使得使用者在輸入為分鐘時,強制加上time強制轉換,某種程度上可以避免輸入是小時的情況。(但貌似這樣也是不安全的)。

四、轉換函式

建構函式只用於從某種型別到類型別的轉換。要進行相反的轉換,必須使用特殊的c++運算子函式——轉換函式。

轉換函式是使用者定義的強制型別轉換,可以像使用強制型別轉換那樣使用它們。例如,如果定義了從time到int的轉換函式,就可以使用下面的轉換:

time mytime(200);

int minutes = double(mytime);    //語法#1

int minutes2 = (double) mytime; //語法#2

也可以讓編譯器來決定如何做:

time mytime(200);

int minutes = mytime;     //轉換函式的隱式呼叫

編譯器發現,右側是time型別,而左側是int型別,因此它將檢視程式設計師是否定義了與此匹配的轉換函式。(如果沒有找到這樣的定義,編譯器將生成錯誤訊息,指出無法將time賦給int)。

要轉換為typename型別,需要使用這種形式的轉換函式:

operator typename();

注意:轉換函式必須是類方法;

轉換函式不能指定返回型別;

轉換函式不能有引數。

要新增將time物件轉換為int型別的函式,需要將下面的原型新增到類宣告中:

operator int();

函式的定義為:

time::operator int() const

同樣,最好用顯式轉換來表明這種轉換。但是舊的c++標準中不能將expli用於轉換函式,但是c++11可以。另外,常見的轉換還會通過類的成員函式的方式來實現。如qt中的qstring轉int,可以呼叫介面qstring::toint()函式來實現將字串型別轉為int。

C 學習筆記13 型別轉換

const cast 運算子用於修改型別的 const volatile 屬性。除了 const 或 volatile 屬性之外,目標型別必須與源型別相同。這種型別的轉換主要是用來操作所傳物件的 const 屬性,可以加上 const 屬性,也可以去掉 const 屬性。class a void f...

C 學習筆記 類的型別轉換

c primer第五版p535頁有這樣一段話 在物件之間不存在型別轉換。派生類向向基類的自動型別轉換只對指標或引用型別有效,在派生類型別和基類型別之間不存在這種轉換。include include includeusing namespace std class animal public void...

Solidity學習 (13)型別轉換

型別轉換,是乙個十分重要,常用的手段 一 隱式轉換 隱式轉換,就是當乙個運算子能支援不同型別,編譯器會隱式的嘗試將乙個運算元的型別,轉為另乙個運算元的型別,賦值同理。條件是 值型別間的互相轉換只要不丟失資訊,語義可通則可轉換。就是說,uint8可轉換到uint16 uint32 等,但不能反過來 同...