轉換函數(conversion function)
??????? operator typ_name()const {}
??????? 類似于基本類型強制轉換的函數,把當前類型對象變為另一個類型的對象。該函數沒有返回類型,函數中return返回typ類。當需要將當前對象與typ對象做運算或者轉換時會找改運算符重載,如果找不到就找轉換函數進行轉換之后在進行運算。可以有多種轉換函數。
調用轉換函數
1
??????? 構造函數中只有一個參數沒有默認參數并沒有explict。構造函數就可以把別的類型對象轉換為當前類型,用于運算。
??????? 如果一個對象中有以上兩種轉換方式,如果在使用過程中兩種方式都能達到目的,編譯就會報錯。這時候再構造函數前加explicit,構造函數就不能進行類型轉換。
pointer-like classes,智能指針
??????? 對于一個class的對象像一個指針,有指針的所有功能但可以有比指針有更多的功能。class里面必然會包含一個真正的指針。
??????? 迭代器就是一種智能指針。
仿函數(function-like classes)
??????? class對象像一個函數,即仿函數。()函數調用操作符,對()進行操作符重載就可以接受()這種操作符。對于標準庫的仿函數都會繼承一些奇特的基類。
namespace
??????? 多人協同作業,防止函數或類或對象的命名沖突;使用的時候用using namespace name或name::
????????? namespace name
????????? {
????????? }
模板template
類模板
??????? template <typname T>
函數模板 function template
??????? 實際使用時不用直接指明class_name。
成員模板 member template
??????? 類模板里面又有一個模板,里面的模板為成員模板。
????????? template<class T2,class T2>
????????? template<class U1,class U2>
??????? 下圖為一個(T1,T2)pair可以由另外一個由派生類(U1,U2)產生的pair構成:
模板特化(specialization)
??????? 設計一個模板之后,將泛化部分縮小可以有的范圍或固定一個。
?????????? ?template<>
?????????? class class_name<typ_name>{}
模板偏特化(partial specialization)
??????? 個數上的偏特化對于由多個模板參數的時候可以對其中一個或兩個進行偏特化。
??????? 范圍偏特化,將一個泛化類型縮小其范圍,比如說任意意類型縮小為任意類型的指針。
模板模板參數(template template parameter)
??????? 模板的參數本身又是一個模板,在template上class與typename是共通的。
c++標準庫
??????? 標準庫提供很多容器(數據結構),算法。算法通過迭代器來操作容器。通過算法和數據結構產生程序。
數量不定模板參數(variadic templates)
??????? 模板接受的參數個數是不定的,然后在函數參數表中把其中確定個數分出來,剩下的打包。包可以繼續進行處理類似于遞歸。
???????? sizeof...(args),可以知道args有多少個內容;
??????? auto 變量可以用于存放不知道類型的數據,但是不能直接定義一個auto變量不賦初值。
范圍for循環(ranged-base for):
??????? for(decl:coll)用于在容器coll里面遍歷;
reference
??????? 引用和所引用的對象大小和地址都一模一樣,但是對于編譯器來說引用都是通過指針來實現的;引用在定義的時候就必須應用一個對象,不能在之后改變為其他對象;應用可以和所引用的對象有相同的操作。
??????? 引用一般用于函數參數傳遞和返回,函數參數是引用和值的不同,這種不能實現函數的重載,因為是一樣的簽名。而加或不加const是可以實現重載的,const是屬于函數簽名的一部分。
內存對齊
??????? 一個類,實例化的對象所占空間的大小并不等于,當前類中所有成員變量和虛指針所占大小的和,這是由于內存對齊的影響。內存對齊是編譯器的管轄范圍,編譯器為程序中的每個“數據單元”安排在適當的位置上。內存對齊主要有兩大作用:
? ? ? ? 1. 平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常;
? ? ? ? 2. 性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。能加快訪問速度使程序運行效率更高。
??????? 對于內存對齊規律,對于不同的編譯器由不同的對齊方法;而派生類的內存對齊是先在基類的內存對齊規律上,對基類進行構造,然后才對派生類所剩余的成員變量進行大度的內存對齊。