Boolan C++(下)1

1.Conversion Function

基本類型之間可以互相轉(zhuǎn)換,那么類類型呢?看下面代碼


輸出結(jié)果是4.6

在運(yùn)算 4 + f 時有兩條路:

(1)編譯器會去找有沒有一個叫 operator + 的函數(shù)(這里只給出類內(nèi)的例子)


(2)如果沒有就去找一個叫 operator double 的函數(shù)


轉(zhuǎn)換函數(shù)的語法: operator 類型()

在這個例子中只有operator double()所以編譯器會先調(diào)用他把 f 轉(zhuǎn)換成 0.6 然后加上 4。

在類中可以寫多個轉(zhuǎn)換函數(shù),只要覺得有必要,在需要轉(zhuǎn)換的場合編譯器會自己去調(diào)用相應(yīng)的轉(zhuǎn)換函數(shù)(和隱式類型轉(zhuǎn)換很像,當(dāng)然也可以強(qiáng)轉(zhuǎn))。

2.non-explicit-one-argument ctor


當(dāng)執(zhí)行到 f + 4 時,會調(diào)用operator + 這個函數(shù),然而 4 是一個整數(shù)不是Fraction類(operator +的參數(shù)是const Fraction& m),那么4要怎么加到 f 上去呢?

看一下構(gòu)造函數(shù):


這個構(gòu)造函數(shù)他有兩個參數(shù),其中一個是有默認(rèn)值的,另外一個需要自己傳遞參數(shù),這種只需要傳遞一個參數(shù)的構(gòu)造函數(shù)被叫做單參構(gòu)造。

當(dāng)執(zhí)行 f + 4 時,會先調(diào)用單參構(gòu)造函數(shù),將4變成一個Fraction(4,1)對象(在臨時區(qū)里),然后在調(diào)用operator + 。

單參構(gòu)造函數(shù)可以把別的東西轉(zhuǎn)換成對應(yīng)的類型(只要可以轉(zhuǎn)換)。

2.1Conversion Function vs non-explicit-one-argument ctor


當(dāng)轉(zhuǎn)換函數(shù)和單參構(gòu)造并存的時候就會發(fā)生error


這是因?yàn)榫幾g器有兩條路完成 d2 = f + 4

(1)調(diào)用單參構(gòu)造,將4轉(zhuǎn)換成Fraction對象,然后調(diào)用operator +,完成計算。

(2)調(diào)用operator double ,將 f 轉(zhuǎn)換成double類型加上4,再調(diào)用單參構(gòu)造轉(zhuǎn)換成Fraction對象,最后賦值。

這時編譯器無法自動選擇哪一條路,需要在單參構(gòu)造函數(shù)前面加上explicit

2.2Explicit-one-argument ctor


加上explicit后,編譯出現(xiàn)新的error


編譯器說:無法將double類型轉(zhuǎn)換成Fraction類型

這是因?yàn)?,先調(diào)用了operator double 將 f 轉(zhuǎn)換成double,然后加上4,這時原本需要使用單參構(gòu)造把結(jié)果轉(zhuǎn)成Fraction類型,但是由于explicit,單參構(gòu)造不能被調(diào)用,所以報錯:無法將double類型轉(zhuǎn)換成Fraction類型。

explicit關(guān)鍵字:在編譯有歧義的時候,起到禁止編譯器自動調(diào)用的功能。

這個關(guān)鍵字一般只在以上這種情況下加在構(gòu)造函數(shù)前。

3.pointer-like classe

一個C++的class可能會像一個指針(面向指針),為什么要把一個class設(shè)計的像一個指針呢,因?yàn)槲覀兿M@個class對象能比普通的指針多做一些事情(這是一個聰明的指針)


在上面的代碼中,通過重載 * 和 -> 這兩個操作符讓類可以像指針一樣使用的能力

智能指針中 * 的操作符重載無一例外,都是如上述代碼這樣寫,因?yàn)橄胍蛯χ羔樈庖?,必需返回的?px(取px指向的地址的內(nèi)容)。

ptr->print(); 通過重載解釋,->與ptr作用,然后返回的是px(指向內(nèi)容的地址),然->應(yīng)該沒有了呀(操作符使用掉了),那為什么相當(dāng)于px->print(),為什么->還留在那里,這是因?yàn)?>符號只要在那里,他的作用會一直保持著,不會被消耗掉。->的寫法也是固定的。

4.Function-like classes

函數(shù)名后面都有一個()操作符,這個()操作符的名字叫 函數(shù)調(diào)用操作符,將()重載之后,類對象就能像函數(shù)一樣使用。


5.member template

成員模板語法:


在類中,下面的構(gòu)造


是類中的一個成員,這個成員自己本身又是一個模板,我們就把這種成員叫為 成員模板。

使用:


在泛型編程中,在構(gòu)造函數(shù),拷貝構(gòu)造這類函數(shù)上面會大量用到成員模板,用來增加函數(shù)的通用性。

在智能指針中也有應(yīng)用:


6.specializtion

設(shè)計一個泛型的Compare類用來比較不同數(shù)據(jù)類型之間的大?。?br>


這個例子只是比較了整數(shù)之間的大小,如果我們想用來比較浮點(diǎn)數(shù)之間的大小,那么這個例子就不可行了,因?yàn)楦↑c(diǎn)數(shù)在計算機(jī)中不能精確的比較,只能指定一個差值范圍進(jìn)行比較。

那么就需要對泛型類進(jìn)行特化處理:


有時為了需要,針對特定的類型,需要對模板進(jìn)行特化,這其實(shí)就是特殊處理。

7.template template parameter


注意:


class Sequence = deque不是模板模板參數(shù),因?yàn)樵谥付0鍏?shù)時,Sequence的值已經(jīng)指定好了,這個模板指定了T后就沒有了灰色的,未確定的東西。


真正的模板模板參數(shù)需要手動指定


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容