C++類型轉(zhuǎn)換函數(shù):將當(dāng)前類的類型轉(zhuǎn)換為其它類型

轉(zhuǎn)換構(gòu)造函數(shù)能夠?qū)⑵渌愋娃D(zhuǎn)換為當(dāng)前類類型(例如將 double 類型轉(zhuǎn)換為 Complex 類型),但是不能反過來(lái)將當(dāng)前類類型轉(zhuǎn)換為其它類型(例如將 Complex 類型轉(zhuǎn)換為 double 類型)。
C++?提供了類型轉(zhuǎn)換函數(shù)(Type conversion function)來(lái)解決這個(gè)問題。類型轉(zhuǎn)換函數(shù)的作用就是將當(dāng)前類類型轉(zhuǎn)換為其它類型,它只能以成員函數(shù)的形式出現(xiàn),也就是只能出現(xiàn)在類中。
類型轉(zhuǎn)換函數(shù)的語(yǔ)法格式為:
operator type(){
? ? //TODO:
? ? return data;
}
operator 是 C++ 關(guān)鍵字,type 是要轉(zhuǎn)換的目標(biāo)類型,data 是要返回的 type 類型的數(shù)據(jù)。
因?yàn)橐D(zhuǎn)換的目標(biāo)類型是 type,所以返回值 data 也必須是 type 類型。既然已經(jīng)知道了要返回 type 類型的數(shù)據(jù),所以沒有必要再像普通函數(shù)一樣明確地給出返回值類型。這樣做導(dǎo)致的結(jié)果是:類型轉(zhuǎn)換函數(shù)看起來(lái)沒有返回值類型,其實(shí)是隱式地指明了返回值類型。
類型轉(zhuǎn)換函數(shù)也沒有參數(shù),因?yàn)橐獙?dāng)前類的對(duì)象轉(zhuǎn)換為其它類型,所以參數(shù)不言而喻。實(shí)際上編譯器會(huì)把當(dāng)前對(duì)象的地址賦值給 this?指針,這樣在函數(shù)體內(nèi)就可以操作當(dāng)前對(duì)象了。關(guān)于 this 的原理請(qǐng)猛擊《C++ this指針詳解》。
【示例】為 Complex 類添加類型轉(zhuǎn)換函數(shù),使得 Complex 類型能夠轉(zhuǎn)換為 double 類型。
f = 24.6
f = 43.1
n = 43
本例中,類型轉(zhuǎn)換函數(shù)非常簡(jiǎn)單,就是返回成員變量 m_real 的值,所以建議寫成 inline 的形式。
類型轉(zhuǎn)換函數(shù)和運(yùn)算符的重載非常相似,都使用 operator 關(guān)鍵字,因此也把類型轉(zhuǎn)換函數(shù)稱為類型轉(zhuǎn)換運(yùn)算符。
關(guān)于類型轉(zhuǎn)換函數(shù)的說明
1) type 可以是內(nèi)置類型、類類型以及由 typedef 定義的類型別名,任何可作為函數(shù)返回類型的類型(void 除外)都能夠被支持。一般而言,不允許轉(zhuǎn)換為數(shù)組或函數(shù)類型,轉(zhuǎn)換為指針類型或引用類型是可以的。
2) 類型轉(zhuǎn)換函數(shù)一般不會(huì)更改被轉(zhuǎn)換的對(duì)象,所以通常被定義為 const 成員。
3) 類型轉(zhuǎn)換函數(shù)可以被繼承,可以是虛函數(shù)。
4) 一個(gè)類雖然可以有多個(gè)類型轉(zhuǎn)換函數(shù)(類似于函數(shù)重載),但是如果多個(gè)類型轉(zhuǎn)換函數(shù)要轉(zhuǎn)換的目標(biāo)類型本身又可以相互轉(zhuǎn)換(類型相近),那么有時(shí)候就會(huì)產(chǎn)生二義性。以 Complex 類為例,假設(shè)它有兩個(gè)類型轉(zhuǎn)換函數(shù):
operator double() const { return m_real; } ?//轉(zhuǎn)換為double類型
operator int() const { return (int)m_real; } ?//轉(zhuǎn)換為int類型
Complex c1(24.6, 100);
float f = 12.5 + c1;