C++面向?qū)ο蟾呒壘幊虒W(xué)習(xí)筆記(二)

conversion function澡屡,轉(zhuǎn)換函數(shù)


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

non-explicit-one-argument ctor


這種構(gòu)造函數(shù)芭挽,它是有兩形參滑废,且后一個形參有初值,所以它允許被一個實參調(diào)用袜爪,后面的形參就設(shè)為默認(rèn)值蠕趁。

所以調(diào)用示例中,編譯器就會自動轉(zhuǎn)換辛馆,以完成編譯俺陋。

當(dāng)conversion function和non-explicit-one-argument ctor并存時,調(diào)用示例中昙篙,就會有兩種可以行的完成方法腊状,編譯器是沒法決定選擇使用哪一種的,所以這樣會報錯苔可。

explicit-one-argument ctor


加了explicit關(guān)鍵字會讓編譯器不能將4轉(zhuǎn)為Fraction缴挖,所以這里調(diào)用時編譯器也會報錯。

class模仿指針

pointer-like classes焚辅,關(guān)于智能指針

智能指針強(qiáng)化了普通指針?biāo)鶝]有的功能映屋,這里暫不詳述。

上面的是C++1.0標(biāo)準(zhǔn)庫簡化后的智能指針同蜻;在指針能用到的操作符就是‘*’和‘->’棚点,所以需要重載這兩個操作符,而且是必須的湾蔓。

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

pointer-like classes赖晶,關(guān)于迭代器


迭代器也相當(dāng)于智能指針俄占,它將指向容器的內(nèi)容;

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

迭代器的‘*’的重載泛释,要返回容器內(nèi)容的數(shù)據(jù)滤愕;

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

class模仿函數(shù)

function-like classes怜校,所謂仿函數(shù)

模仿函數(shù)间影,即是要重載‘()’;

示例中茄茁,類模板是pair(一對的)魂贬,所以寫了兩個struct,實現(xiàn)pair中兩個對象的調(diào)用裙顽。

調(diào)用:

調(diào)用語法

標(biāo)準(zhǔn)庫中付燥,仿函數(shù)所作用的奇特的base classes

在C++標(biāo)準(zhǔn)庫里面,有很多用仿函數(shù)愈犹,都會繼承類似‘binary_function’的classes键科,它不會占用內(nèi)存(實際上可能會占用為1)。

關(guān)于namespace

由于漩怎,在實際的開發(fā)團(tuán)隊中勋颖,各部門之間所寫的代碼,難免會有重名的情況出現(xiàn)勋锤;

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

關(guān)于模板

class template徒恋,類模板


所謂class template蚕断,就是在設(shè)計class時,把那些你認(rèn)為允許使用者任意指定的類型抽出來入挣,用自定義的關(guān)系字代替(這里用‘T’)亿乳;

在調(diào)用時,就像上面一樣,把指定類型寫在‘<>’里面放在類名的后面葛假。

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

function template聊训,函數(shù)模板


所謂函數(shù)模板抱究,就是允許函數(shù)不指明是哪一種類型調(diào)用和返回;

在調(diào)用時带斑,編譯器會進(jìn)行實參推導(dǎo)鼓寺,用來確定調(diào)用的類型;

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

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

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

member template苦银,成員模板

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

特化模板

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

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

但這樣做不是跟不用模板一樣嗎习勤?不一樣踪栋,這樣做可以為每種類型寫不一樣的內(nèi)容。

模板偏特化(局部特化)

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

范圍上的局部特化予颤,例如指針是對應(yīng)類型的部分囤官;

上面便是實現(xiàn)方法,在調(diào)用時編譯器會判斷蛤虐,是否實參為指針形党饮,而選擇下面的一個(上一個和下一個的標(biāo)識符沒有直接的關(guān)聯(lián),可以寫成右邊的)

template template parameter驳庭,模板模板參數(shù)

上面的class刑顺,就是所謂的模板模板參數(shù)的寫法氯窍,黃色的部分,是它與之不同的之處蹲堂;

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

但這樣是還不是調(diào)用的政供,還需要增加中間的兩行才可以(具體原因,會在下一個相關(guān)的章節(jié)詳述)

對于上面的例子能犯,第二模板參數(shù)也使用第一模板參數(shù)‘T’鲫骗,作為它里面的參數(shù)犬耻;

但它不是模板模板參數(shù)踩晶,因為它的第二模板參數(shù)是預(yù)置了默認(rèn)值,不完全是模板枕磁,

在調(diào)用時渡蜻,它可以不寫,而使用默認(rèn)值计济,也可以寫(第二個調(diào)用便是)茸苇,但這樣就不用理會第一參數(shù)的類型,而可以寫上需要的類型沦寂。

這一點就可以與模板模板參數(shù)的定義分開学密。

關(guān)于C++標(biāo)準(zhǔn)庫

在C++的標(biāo)準(zhǔn)庫里面,已經(jīng)涵蓋了很多種容器(數(shù)據(jù)結(jié)構(gòu))和算法传藏,標(biāo)準(zhǔn)庫是很棒的團(tuán)隊寫的腻暮,所以我們要善用標(biāo)準(zhǔn)庫,而不是全都自己去寫毯侦。

學(xué)習(xí)標(biāo)準(zhǔn)庫的最好方法哭靖,就是自己寫一個小程序,應(yīng)用到標(biāo)準(zhǔn)庫的每一個函數(shù)侈离,而不是只去看網(wǎng)上相關(guān)的例子(光看试幽,不實踐)

C++11新標(biāo)準(zhǔn)

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


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

接下來,在第2函數(shù)的第二個形參洲胖,相應(yīng)的也需要的在后面济榨,加上三個點,表示不定個數(shù)的參數(shù)包宾濒。

在調(diào)用時腿短,也需要在參數(shù)包名稱的后面加上三個點。

例子中的第2函數(shù),會被輾轉(zhuǎn)調(diào)用橘忱,直到把42輸出是赴魁,參數(shù)包args...內(nèi)沒有參數(shù)了,print(args...)調(diào)用的就會是第1函數(shù)钝诚,從而結(jié)束運行颖御。

例子是函數(shù),當(dāng)然凝颇,類也可以使用這個C++2.0的新特性潘拱。

auto

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

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

ranged-base for

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

例子中川无,for的里面的‘{}’表示容器(它也是C++11的新標(biāo)準(zhǔn))

例子的for語句將會實現(xiàn)的是,把容器coll里的內(nèi)容虑乖,逐個賦值給變量decl懦趋,直到容器遍歷完成。

若想要改變?nèi)萜鲀?nèi)的值疹味,則需要使用pass by reference仅叫。

關(guān)于reference

reference在定義時一定要有初值,而且不能被改變佛猛,直到它的生命結(jié)束惑芭。

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

二者不能并存的原因婴渡,是函數(shù)簽名signature相同幻锁,使程序產(chǎn)生歧義Ambiguity,導(dǎo)致編譯模棱兩可边臼;

函數(shù)灰色部分可以加const哄尔,const也是函數(shù)簽名的一部分,所以二者其中一個加上const柠并,就可以使它們兩者并存岭接。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末富拗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸣戴,更是在濱河造成了極大的恐慌啃沪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窄锅,死亡現(xiàn)場離奇詭異创千,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)入偷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門追驴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疏之,你說我怎么就攤上這事殿雪。” “怎么了体捏?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵冠摄,是天一觀的道長糯崎。 經(jīng)常有香客問我几缭,道長,這世上最難降的妖魔是什么沃呢? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任年栓,我火速辦了婚禮,結(jié)果婚禮上薄霜,老公的妹妹穿的比我還像新娘某抓。我一直安慰自己,他們只是感情好惰瓜,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布否副。 她就那樣靜靜地躺著,像睡著了一般崎坊。 火紅的嫁衣襯著肌膚如雪备禀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天奈揍,我揣著相機(jī)與錄音曲尸,去河邊找鬼。 笑死男翰,一個胖子當(dāng)著我的面吹牛另患,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛾绎,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼昆箕,長吁一口氣:“原來是場噩夢啊……” “哼鸦列!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹏倘,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤敛熬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后第股,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體应民,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年夕吻,在試婚紗的時候發(fā)現(xiàn)自己被綠了诲锹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡涉馅,死狀恐怖归园,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稚矿,我是刑警寧澤庸诱,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站晤揣,受9級特大地震影響桥爽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昧识,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一钠四、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跪楞,春花似錦缀去、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至池户,卻和暖如春咏雌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煞檩。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工处嫌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斟湃。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓熏迹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凝赛。 傳聞我的和親對象是個殘疾皇子注暗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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