C++面向對象高級編程學習筆記(二)

conversion function,轉換函數


語法:如黃色部分所示,名稱“operator+類型”,沒有參數,它的返回類型要與名稱中的類型一致,并且作者不能寫出來。

non-explicit-one-argument ctor


這種構造函數,它是有兩形參,且后一個形參有初值,所以它允許被一個實參調用,后面的形參就設為默認值。

所以調用示例中,編譯器就會自動轉換,以完成編譯。

當conversion function和non-explicit-one-argument ctor并存時,調用示例中,就會有兩種可以行的完成方法,編譯器是沒法決定選擇使用哪一種的,所以這樣會報錯。

explicit-one-argument ctor


加了explicit關鍵字會讓編譯器不能將4轉為Fraction,所以這里調用時編譯器也會報錯。

class模仿指針

pointer-like classes,關于智能指針

智能指針強化了普通指針所沒有的功能,這里暫不詳述。

上面的是C++1.0標準庫簡化后的智能指針;在指針能用到的操作符就是‘*’和‘->’,所以需要重載這兩個操作符,而且是必須的。

語法: ‘*’的重載是直接返回指向的內容;而‘->’則是返回實際的指針,但是這樣‘->’不就是消耗了嗎?然而‘->’它在C++的定義是可以重復使用的,就是說完成重載函數后,它繼續起作用。

pointer-like classes,關于迭代器


迭代器也相當于智能指針,它將指向容器的內容;

有所不同的是會有更多的操作符重載‘++’和‘--’,這些操作符作用于指針則是用于移位(內存地址),而這里則是改變在鏈表中的位置;

迭代器的‘*’的重載,要返回容器內容的數據;

而‘->’的重載則是返回容器內容數據的地址(即是返回指針)。

class模仿函數

function-like classes,所謂仿函數

模仿函數,即是要重載‘()’;

示例中,類模板是pair(一對的),所以寫了兩個struct,實現pair中兩個對象的調用。

調用:

調用語法

標準庫中,仿函數所作用的奇特的base classes

在C++標準庫里面,有很多用仿函數,都會繼承類似‘binary_function’的classes,它不會占用內存(實際上可能會占用為1)。

關于namespace

由于,在實際的開發團隊中,各部門之間所寫的代碼,難免會有重名的情況出現;

或者自己寫的測試程序也會有重名的情況,利用命名空間namespace,去解決重名情況,這樣一來就可以在不同的namespace中都使用自己習慣的名稱,不用再苦惱為變量和函數如何命名的問題。

關于模板

class template,類模板


所謂class template,就是在設計class時,把那些你認為允許使用者任意指定的類型抽出來,用自定義的關系字代替(這里用‘T’);

在調用時,就像上面一樣,把指定類型寫在‘<>’里面放在類名的后面。

語法:用template,表示T為未指定類型(可以是類,也可以是普通的數據類型)

function template,函數模板


所謂函數模板,就是允許函數不指明是哪一種類型調用和返回;

在調用時,編譯器會進行實參推導,用來確定調用的類型;

要注意的是對象的類的功能要完善,要用到的操作符一定要重載。

語法:用template,表示T為未知的類型;

(在模板定義的語法中關鍵字class和typename的作用是完全一樣的)

member template,成員模板

所謂成員模板(也可以說是模板成員),就是說它是類的成員,而且它本身又是一個模板。

特化模板

最前面的是普通的類模板,可以接收所有的類型,稱為泛化模板;

而后面的三個則是特化模板,它是泛化模板中的特例,只能接收指定的類型;(如果泛化模板和特化模板同時存在,編譯器會先檢測特化模板)

但這樣做不是跟不用模板一樣嗎?不一樣,這樣做可以為每種類型寫不一樣的內容。

模板偏特化(局部特化)

個數上的部分特化,將部分確定的形參類型和不確定的模板參數類型的標識符依次排序。(左邊的一定要是確定的形參類型,而不能有非模板和模板參數穿插在里面)

范圍上的局部特化,例如指針是對應類型的部分;

上面便是實現方法,在調用時編譯器會判斷,是否實參為指針形,而選擇下面的一個(上一個和下一個的標識符沒有直接的關聯,可以寫成右邊的)

template template parameter,模板模板參數

上面的class,就是所謂的模板模板參數的寫法,黃色的部分,是它與之不同的之處;

黃色部分表示,Container自身為模板,并且用第一模板參數‘T’作為它里面的參數類型(黃色里面的‘T’,就是指第一個模板‘T’);

但這樣是還不是調用的,還需要增加中間的兩行才可以(具體原因,會在下一個相關的章節詳述)

對于上面的例子,第二模板參數也使用第一模板參數‘T’,作為它里面的參數;

但它不是模板模板參數,因為它的第二模板參數是預置了默認值,不完全是模板,

在調用時,它可以不寫,而使用默認值,也可以寫(第二個調用便是),但這樣就不用理會第一參數的類型,而可以寫上需要的類型。

這一點就可以與模板模板參數的定義分開。

關于C++標準庫

在C++的標準庫里面,已經涵蓋了很多種容器(數據結構)和算法,標準庫是很棒的團隊寫的,所以我們要善用標準庫,而不是全都自己去寫。

學習標準庫的最好方法,就是自己寫一個小程序,應用到標準庫的每一個函數,而不是只去看網上相關的例子(光看,不實踐)

C++11新標準

variadic template (數量不定的模板參數)


上面第2函數的第二模板參數便是,用typename...(記得是在typename后面加三個點),聲明使用variadic template,表示接收一個參數包(里面有個數不定的參數)

接下來,在第2函數的第二個形參,相應的也需要的在后面,加上三個點,表示不定個數的參數包。

在調用時,也需要在參數包名稱的后面加上三個點。

例子中的第2函數,會被輾轉調用,直到把42輸出是,參數包args...內沒有參數了,print(args...)調用的就會是第1函數,從而結束運行。

例子是函數,當然,類也可以使用這個C++2.0的新特性。

auto

它的作用是,在變量聲明時賦值的情況下,能讓編譯器通過判斷值的類型,來確定變量的類型。

若在變量只聲明不賦值時,編譯器則無法確定變量的類型,所以最后的用法是不允許的。

ranged-base for

注釋:decl表示變量,coll表示容器

例子中,for的里面的‘{}’表示容器(它也是C++11的新標準)

例子的for語句將會實現的是,把容器coll里的內容,逐個賦值給變量decl,直到容器遍歷完成。

若想要改變容器內的值,則需要使用pass by reference。

關于reference

reference在定義時一定要有初值,而且不能被改變,直到它的生命結束。

例子中,r是代表x的,r擁有x的所以特性,也就是說r和它所代表的x的大小相同,地址相同(不過這是編譯器所制造的假象)

二者不能并存的原因,是函數簽名signature相同,使程序產生歧義Ambiguity,導致編譯模棱兩可;

函數灰色部分可以加const,const也是函數簽名的一部分,所以二者其中一個加上const,就可以使它們兩者并存。

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

推薦閱讀更多精彩內容