最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

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

2023-03-23 13:23 作者:c語(yǔ)言-小新  | 我要投稿

轉(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 類型。


運(yùn)行結(jié)果:
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ù):

  1. operator double() const { return m_real; } ?//轉(zhuǎn)換為double類型

  2. operator int() const { return (int)m_real; } ?//轉(zhuǎn)換為int類型

那么下面的寫法就會(huì)引發(fā)二義性:
  1. Complex c1(24.6, 100);

  2. float f = 12.5 + c1;

編譯器可以調(diào)用 operator double() 將 c1 轉(zhuǎn)換為 double 類型,也可以調(diào)用?operator int() 將 c1 轉(zhuǎn)換為 int 類型,這兩種類型都可以跟 12.5 進(jìn)行加法運(yùn)算,并且從 Complex 轉(zhuǎn)換為 double 與從 Complex 轉(zhuǎn)化為 int 是平級(jí)的,沒有誰(shuí)的優(yōu)先級(jí)更高,所以這個(gè)時(shí)候編譯器就不知道該調(diào)用哪個(gè)函數(shù)了,干脆拋出一個(gè)二義性錯(cuò)誤,讓用戶解決。


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

分享到微博請(qǐng)遵守國(guó)家法律
万盛区| 浦东新区| 运城市| 行唐县| 尚义县| 股票| 潞城市| 若羌县| 珠海市| 历史| 从化市| 台南市| 谷城县| 新郑市| 教育| 泸定县| 江城| 临猗县| 九寨沟县| 松原市| 萨迦县| 银川市| 得荣县| 浦北县| 通山县| 双鸭山市| 萍乡市| 台前县| 刚察县| 广州市| 仁化县| 湛江市| 黄梅县| 北京市| 日照市| 闽清县| 交口县| 密山市| 洛隆县| 申扎县| 广州市|