Boolan C++(下)1

1.Conversion Function

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


輸出結(jié)果是4.6

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

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


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


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

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

在類中可以寫多個(gè)轉(zhuǎn)換函數(shù),只要覺得有必要,在需要轉(zhuǎn)換的場(chǎng)合編譯器會(huì)自己去調(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 時(shí),會(huì)調(diào)用operator + 這個(gè)函數(shù),然而 4 是一個(gè)整數(shù)不是Fraction類(operator +的參數(shù)是const Fraction& m),那么4要怎么加到 f 上去呢?

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


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

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

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

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


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


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

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

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

這時(shí)編譯器無法自動(dòng)選擇哪一條路,需要在單參構(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,這時(shí)原本需要使用單參構(gòu)造把結(jié)果轉(zhuǎn)成Fraction類型,但是由于explicit,單參構(gòu)造不能被調(diào)用,所以報(bào)錯(cuò):無法將double類型轉(zhuǎn)換成Fraction類型。

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

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

3.pointer-like classe

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


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

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

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

4.Function-like classes

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


5.member template

成員模板語法:


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


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

使用:


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

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


6.specializtion

設(shè)計(jì)一個(gè)泛型的Compare類用來比較不同數(shù)據(jù)類型之間的大小:


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

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


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

7.template template parameter


注意:


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


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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容