C++程序設(shè)計(jì)(Ⅱ)
提醒:勿在浮沙筑高臺
泛型編程和面向?qū)ο缶幊淌荂++的技術(shù)主線
深入探索面向?qū)ο笾^承關(guān)系所形成的對象模型(Object Model),包括隱藏于底層的this指針,vptr(需指針),vtbl(虛表),virtual mechanism(需機(jī)制),以及虛函數(shù)(virtual functions) 造成的polymorphism(多態(tài))效果。
2.Conversion Function 轉(zhuǎn)換函數(shù)
operator function_name() const{return ......}
operator 是關(guān)鍵字,不可以有參數(shù) 且不寫返回值,另外,函數(shù)名稱是一種數(shù)據(jù)類型且通常+ const。
?
3.non-explicit-one-argument ctor
只要一個實(shí)參就夠了,
explicit --意思是明白的,明確的 告訴編譯器不要進(jìn)行隱式操作。一般在構(gòu)造函數(shù)前面。
typedef 類型 重命名
4.pointer-like classes,關(guān)于智能指針,智能指針必然是一個class。
? ? ?一個智能指針一定是一個類,數(shù)據(jù)成員至少有一個指針成員和若干操作方法。操作方法中一定有->操作符重載和*操作符重載,用于獲取成員指針和成員指針指向的內(nèi)容(或?qū)ο?
5.pointer-like classes ,關(guān)于迭代器
? ? ?迭代器代表容器【vector】中一種元素,因此它也可以看作為一個智能指針。也就是創(chuàng)建一個class 模擬pointer功能。
6.function-like classes,所謂仿函數(shù)
? ? ?創(chuàng)建一個class,用來模擬function,因此需要對操作符()重載。 類似這些class創(chuàng)建出來的對象都是 “函數(shù)對象”或稱為“仿函數(shù)”
7.namespace 經(jīng)驗(yàn)談
? ? ?將一些變量、函數(shù)等封裝到一個namespace里面,類似劃區(qū)間分類的感念。
8.class template,類模板
? ? ?template<typename T>
? ? ?在你設(shè)計(jì)類的時候,你考慮可以把哪些類型抽出來,好動態(tài)傳遞,使得創(chuàng)建的類具備通用性。
? ? ?在創(chuàng)建類模板對象時,一定要指定模板類型例如,complex<double>c1(2.5,1.5)
9.function template ,函數(shù)模板
? ? ?函數(shù)模板在使用時,不必指定數(shù)據(jù)類型。例如,min(r1,r2);原因在于編譯器會進(jìn)行實(shí)參推導(dǎo)(argument deduction)
10.member template,成員模板
?????一個成員是一個模板的成員,而這個成員本身也是一個模版,那么我們就稱這個成員為成員模板。個人理解是模板嵌套。
? ? ?up-cast ? ? ?允許子類指針指向父類對象。
? ? ? ? ??
11.specialization,模板特化
? ? ?什么叫泛化:就是使用模板template進(jìn)行設(shè)計(jì)類和函數(shù)。
? ? ?什么叫特化:為了某些獨(dú)特的類型進(jìn)行特殊的設(shè)計(jì)。
? ? ?
12.partial specialization,模板偏特化
? ? ?也叫局部特化,有兩種形式:
?????【個數(shù)上的偏】,例如,模板參數(shù)有N個,如果此時你想綁定某一個參數(shù)類型。且綁定順序一定是連續(xù)的。
?????【范圍上的偏】,由原來的任意數(shù)據(jù)類型,縮小到例如,任意類型指針且必須是指針類型。
13.template template parameter,模板模板參數(shù)
? ? ?

下面的截圖不是模板模板參數(shù)

- 關(guān)于C++標(biāo)準(zhǔn)庫
? ?? ?????對于初學(xué)者一定要熟悉它,多使用它。
? ??????? 容器Sequence Containers
? ? ? ? ? ? ? ? ? ? ? ? ?array
? ? ? ? ? ? ? ? ? ? ? ? ?vector
? ? ? ? ? ? ? ? ? ? ? ? ?deque
? ? ? ? ? ? ? ? ? ? ? ? ?forward_list
? ? ? ? ? ? ? ? ? ? ? ? ?list
? ? ? ? ? ? ? ?Container adaptors:
? ? ? ? ? ? ? ? ? ? ? ? ?stack
? ? ? ? ? ? ? ? ? ? ? ? ?queue
? ? ? ? ? ? ? ? ? ? ? ? ?priority_queue
? ?? ?????算法Algorithms
? ? ? ? ? ? ? ? Sorting:
? ? ? ? ? ? ? ? ? ? ? ? ?sort
? ? ? ? ? ? ? ? ? ? ? ? ?stable_sort
? ? ? ? ? ? ? ? ? ? ? ? ?partial_sort
? ? ? ? ? ? ? ? ? ? ? ? ?partial_sort_copy
? ? ? ? ? ? ? ? ? ? ? ? ?is_sorted
? ? ? ? ? ? ? ? ? ? ? ? ?is_sorted_until
? ? ? ? ? ? ? ? ? ? ? ? ?nth_element
? ? ? ? ? ? ?? Binary search
? ? ? ? ? ? ? ? ? ? ? ? ?lower_bound
? ? ? ? ? ? ? ? ? ? ? ? ?upper_bound
? ? ? ? ? ? ? ? ? ? ? ? ?equal_range
? ? ? ? ? ? ? ? ? ? ? ? ?binary_search
? ? ?
? ? ? ? ? ? ? ?Merge(operating on sorted)
? ? ? ? ? ? ? ? ? ? ? ? ?merge
? ? ? ? ? ? ? ? ? ? ? ? ?inplace_merge
? ? ? ? ? ? ? ? ? ? ? ? ?includes
? ? ? ? ? ? ? ? ? ? ? ? ?set_union
? ? ? ? ? ? ? ? ? ? ? ? ?set_intersection
? ? ? ? ? ? ? ? ? ? ? ? ?set_difference
? ? ? ? ? ? ? ? ? ? ? ? ?set_symmetric_difference
? ? ? ? ? ? ? ? ? ? ? ? ?......
? ? ?不要眼高手低,盡量測試這些數(shù)據(jù)結(jié)構(gòu)和算法。

auto 語法糖
以前:
list<string> c;
...
list<string>::iterator ite;
ite = find(c.begin(),c.end(),target);
現(xiàn)在:
list<string>c;
...
auto ite =find(c.begin(),c.end(),target);
ranged-base for
for(decl:coll){
? ? ?statement
}
//decl 可以是一個變量,coll必須是一個容器
例如,for(int i:{2,3,4,5,6,9}){
? ? ?cout <<i<<endl;
}


動態(tài)綁定或虛機(jī)制:
必要條件:
1.必須要是指針
2.向上轉(zhuǎn)型
3.調(diào)用的是虛函數(shù)
靜態(tài)綁定:通過地址直接訪問。
對象模型:關(guān)于this
在C++中所有成員函數(shù)都有一個隱藏的this指針。
有關(guān)new 、delete
new:先分配memory,再調(diào)用ctor
delete:先調(diào)用dtor,再釋放memory
array new 一定要搭配array delete
? ? ?例如,String* p = new String[3];
? ? ? ? ? ? ? ?delete[] p;//喚醒3次dtor
重載::operator new ,::operator delete
? ? ? ::operator new[],::operator delete[]

