Boolan C++(下)1

1.Conversion Function

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


輸出結果是4.6

在運算 4 + f 時有兩條路:

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


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


轉換函數的語法: operator 類型()

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

在類中可以寫多個轉換函數,只要覺得有必要,在需要轉換的場合編譯器會自己去調用相應的轉換函數(和隱式類型轉換很像,當然也可以強轉)。

2.non-explicit-one-argument ctor


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

看一下構造函數:


這個構造函數他有兩個參數,其中一個是有默認值的,另外一個需要自己傳遞參數,這種只需要傳遞一個參數的構造函數被叫做單參構造。

當執行 f + 4 時,會先調用單參構造函數,將4變成一個Fraction(4,1)對象(在臨時區里),然后在調用operator + 。

單參構造函數可以把別的東西轉換成對應的類型(只要可以轉換)。

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


當轉換函數和單參構造并存的時候就會發生error


這是因為編譯器有兩條路完成 d2 = f + 4

(1)調用單參構造,將4轉換成Fraction對象,然后調用operator +,完成計算。

(2)調用operator double ,將 f 轉換成double類型加上4,再調用單參構造轉換成Fraction對象,最后賦值。

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

2.2Explicit-one-argument ctor


加上explicit后,編譯出現新的error


編譯器說:無法將double類型轉換成Fraction類型

這是因為,先調用了operator double 將 f 轉換成double,然后加上4,這時原本需要使用單參構造把結果轉成Fraction類型,但是由于explicit,單參構造不能被調用,所以報錯:無法將double類型轉換成Fraction類型。

explicit關鍵字:在編譯有歧義的時候,起到禁止編譯器自動調用的功能。

這個關鍵字一般只在以上這種情況下加在構造函數前。

3.pointer-like classe

一個C++的class可能會像一個指針(面向指針),為什么要把一個class設計的像一個指針呢,因為我們希望這個class對象能比普通的指針多做一些事情(這是一個聰明的指針)


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

智能指針中 * 的操作符重載無一例外,都是如上述代碼這樣寫,因為想要和對指針解引用,必需返回的是*px(取px指向的地址的內容)。

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

4.Function-like classes

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


5.member template

成員模板語法:


在類中,下面的構造


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

使用:


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

在智能指針中也有應用:


6.specializtion

設計一個泛型的Compare類用來比較不同數據類型之間的大小:


這個例子只是比較了整數之間的大小,如果我們想用來比較浮點數之間的大小,那么這個例子就不可行了,因為浮點數在計算機中不能精確的比較,只能指定一個差值范圍進行比較。

那么就需要對泛型類進行特化處理:


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

7.template template parameter


注意:


class Sequence = deque不是模板模板參數,因為在指定模板參數時,Sequence的值已經指定好了,這個模板指定了T后就沒有了灰色的,未確定的東西。


真正的模板模板參數需要手動指定


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容