轉(zhuǎn)換函數(shù)(conversion function)
??????? operator typ_name()const {}
??????? 類似于基本類型強(qiáng)制轉(zhuǎn)換的函數(shù),把當(dāng)前類型對象變?yōu)榱硪粋€類型的對象。該函數(shù)沒有返回類型考婴,函數(shù)中return返回typ類。當(dāng)需要將當(dāng)前對象與typ對象做運算或者轉(zhuǎn)換時會找改運算符重載墩莫,如果找不到就找轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換之后在進(jìn)行運算厅贪。可以有多種轉(zhuǎn)換函數(shù)堤结。
調(diào)用轉(zhuǎn)換函數(shù)
1
??????? 構(gòu)造函數(shù)中只有一個參數(shù)沒有默認(rèn)參數(shù)并沒有explict。構(gòu)造函數(shù)就可以把別的類型對象轉(zhuǎn)換為當(dāng)前類型鸭丛,用于運算竞穷。
??????? 如果一個對象中有以上兩種轉(zhuǎn)換方式,如果在使用過程中兩種方式都能達(dá)到目的鳞溉,編譯就會報錯瘾带。這時候再構(gòu)造函數(shù)前加explicit,構(gòu)造函數(shù)就不能進(jìn)行類型轉(zhuǎn)換熟菲。
pointer-like classes看政,智能指針
??????? 對于一個class的對象像一個指針朴恳,有指針的所有功能但可以有比指針有更多的功能。class里面必然會包含一個真正的指針允蚣。
??????? 迭代器就是一種智能指針于颖。
仿函數(shù)(function-like classes)
??????? class對象像一個函數(shù),即仿函數(shù)嚷兔。()函數(shù)調(diào)用操作符森渐,對()進(jìn)行操作符重載就可以接受()這種操作符。對于標(biāo)準(zhǔn)庫的仿函數(shù)都會繼承一些奇特的基類冒晰。
namespace
??????? 多人協(xié)同作業(yè)同衣,防止函數(shù)或類或?qū)ο蟮拿麤_突;使用的時候用using namespace name或name::
????????? namespace name
????????? {
????????? }
模板template
類模板
??????? template <typname T>
函數(shù)模板 function template
??????? 實際使用時不用直接指明class_name壶运。
成員模板 member template
??????? 類模板里面又有一個模板耐齐,里面的模板為成員模板。
????????? template<class T2,class T2>
????????? template<class U1,class U2>
??????? 下圖為一個(T1,T2)pair可以由另外一個由派生類(U1,U2)產(chǎn)生的pair構(gòu)成:
模板特化(specialization)
??????? 設(shè)計一個模板之后前弯,將泛化部分縮小可以有的范圍或固定一個蚪缀。
?????????? ?template<>
?????????? class class_name<typ_name>{}
模板偏特化(partial specialization)
??????? 個數(shù)上的偏特化對于由多個模板參數(shù)的時候可以對其中一個或兩個進(jìn)行偏特化。
??????? 范圍偏特化恕出,將一個泛化類型縮小其范圍询枚,比如說任意意類型縮小為任意類型的指針。
模板模板參數(shù)(template template parameter)
??????? 模板的參數(shù)本身又是一個模板浙巫,在template上class與typename是共通的金蜀。
c++標(biāo)準(zhǔn)庫
??????? 標(biāo)準(zhǔn)庫提供很多容器(數(shù)據(jù)結(jié)構(gòu)),算法的畴。算法通過迭代器來操作容器渊抄。通過算法和數(shù)據(jù)結(jié)構(gòu)產(chǎn)生程序。
數(shù)量不定模板參數(shù)(variadic templates)
??????? 模板接受的參數(shù)個數(shù)是不定的丧裁,然后在函數(shù)參數(shù)表中把其中確定個數(shù)分出來护桦,剩下的打包。包可以繼續(xù)進(jìn)行處理類似于遞歸煎娇。
???????? sizeof...(args),可以知道args有多少個內(nèi)容二庵;
??????? auto 變量可以用于存放不知道類型的數(shù)據(jù),但是不能直接定義一個auto變量不賦初值缓呛。
范圍for循環(huán)(ranged-base for):
??????? for(decl:coll)用于在容器coll里面遍歷催享;
reference
??????? 引用和所引用的對象大小和地址都一模一樣,但是對于編譯器來說引用都是通過指針來實現(xiàn)的哟绊;引用在定義的時候就必須應(yīng)用一個對象因妙,不能在之后改變?yōu)槠渌麑ο螅粦?yīng)用可以和所引用的對象有相同的操作。
??????? 引用一般用于函數(shù)參數(shù)傳遞和返回攀涵,函數(shù)參數(shù)是引用和值的不同铣耘,這種不能實現(xiàn)函數(shù)的重載,因為是一樣的簽名汁果。而加或不加const是可以實現(xiàn)重載的涡拘,const是屬于函數(shù)簽名的一部分。
內(nèi)存對齊
??????? 一個類据德,實例化的對象所占空間的大小并不等于,當(dāng)前類中所有成員變量和虛指針?biāo)即笮〉暮王纬担@是由于內(nèi)存對齊的影響棘利。內(nèi)存對齊是編譯器的管轄范圍,編譯器為程序中的每個“數(shù)據(jù)單元”安排在適當(dāng)?shù)奈恢蒙闲嘟伞?nèi)存對齊主要有兩大作用:
? ? ? ? 1. 平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的善玫;某些硬件平臺只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常密强;
? ? ? ? 2. 性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊茅郎。原因在于,為了訪問未對齊的內(nèi)存或渤,處理器需要作兩次內(nèi)存訪問系冗;而對齊的內(nèi)存訪問僅需要一次訪問。能加快訪問速度使程序運行效率更高薪鹦。
??????? 對于內(nèi)存對齊規(guī)律掌敬,對于不同的編譯器由不同的對齊方法;而派生類的內(nèi)存對齊是先在基類的內(nèi)存對齊規(guī)律上池磁,對基類進(jìn)行構(gòu)造奔害,然后才對派生類所剩余的成員變量進(jìn)行大度的內(nèi)存對齊。