一:類的初始化列表:
http://www.kuqin.com/effectivec2e/ch03c.htm
上面這篇語言易懂
http://blog.csdn.net/gzshun/article/details/7256507
這篇講的比較有道理,理據比較充分。
感受:
首先:類是個概括的概念,其應用就是對象,而對其初始化就是對其具體化;
其次:在兩篇文章中都講到一點,對於內建類型,初始化列表和初始化賦值效率都是差不多的;而對於自己定義的類型,一般初始化列表的效率高於初始化賦值。
原因在第二篇文章中討論的很清楚,對於自己定義的類型賦值其本質上講其不是一個賦值而是兩步操作,定義函數和operate調用,只不過這裡是寫成的賦值形式。
二:類的申明和執行
http://topic.csdn.net/u/20100808/10/82d08af6-aa0b-4485-9b60-2591e4c1f697.html
比較贊成類是先掃描聲明在執行的這種說話。(這裡好像不對,從後面友元函數的講解可以這樣記:函數是先掃描申明後執行,變數是直接執行,當然這裡只是一種記憶方法。)
第三:類的私人成員和共有成員、保護成員
http://www.quanxue.cn/JC_CLanguage/Cpp/Cpp07.html
感受:
類一共以三種成員形式劃分了三種範圍(兩大類三小類):類本身、類的拓展類(繼承和派生)、外部函數。
其中:私人成員是類本身自己用的,保護成員是可以給拓展類用的,公有成員是可以和外部函數一起用的。其實這裡就是個範圍劃分的問題,這種範圍是“物理上”的範圍,這樣也表現出了類的封裝和繼承特性。這裡可以把不同的類看著不同的黑盒,這樣非常便於理解。
第四:友元函數
http://www.quanxue.cn/JC_CLanguage/Cpp/Cpp14.html
感受:
其實在上面的三種範圍中,從大體上可以分成兩種範圍:類和外部函數。為了串連兩大類,於是提出了友元函數的概念,這樣可以在外部範圍訪問類裡面。因此,友元函數必須在類的裡面申明,但是其不是類的成員函數,對於派生情況,友元函數只能向上繼承。
第五:虛函數
http://www.quanxue.cn/JC_CLanguage/Cpp/Cpp11.html
感受:
這點非常重要:在衍生類別中用同名函數“實裝”基類的虛函數。如果衍生類別中沒有同名函數,則仍用基類的虛函數實裝。
在這裡對於虛函數要理解一個重要問題,什麼是虛?這裡的虛其實是和實相對應的。實就是一般的函數,其是實實在在的運行;而虛函數不會向實函數那樣運行,而是實現多態性。
第六:函數指標和指標函數
http://baike.baidu.com/view/1604730.htm
感受:
一個是函數,一個是指標。其實兩者沒有什麼特別的,只是函數的傳回值和指標指向的對象和原來不大一樣,但是本質上和函數、指標一樣的,只是外表不同而已。比如,指標函數去去內容就是函數本身。
例:
int fun1(char*,int);
int (*pfun1)(char*,int);
pfun1=fun1;
int a=(*pfun1)("abcdefg",7);
第七:類的this指標
http://www.cnblogs.com/st_zhang/archive/2010/09/07/1820488.html
感受:
只看了前面一點點,沒有想到類也是通過this指標進行標識的。
第八:容器的迭代器
http://blog.csdn.net/yxysdcl/article/details/5567460
感受:
有了模板,我麼可以把演算法和特定的資料類型分離開來,而有了迭代器,我們可以將演算法和特定的額容器分開來。
不論是vector的迭代器作為基礎指標類型,還是list的迭代器作為一個類,其基本思想就是統一操作,讓資料訪問的方式簡單、統一,類似指標的訪問形式。
第九:函數對象
http://www.cnblogs.com/ly4cn/archive/2007/07/21/826885.html
這裡附上c++ primer的解釋:
首先定義一個類:
struct absInt{ int operate()(int val){ return val<0?-val:val; }};
這裡在類裡面定義了一個重載操作符()
int i=-42;absInt absObj;unsigned int ui=absObj(i);
在這裡absObj是一個類的對象而不是函數,但是因為這個類重載了叫用作業符(),因此其有“對象()”操作,其實質是“類::operator()”。其實就這樣理解就可以,定義了叫用作業符的類,其對象稱為函數對象。