1. C++中,內存分配和對象構造緊密糾纏,就像對象析構和內存回收一樣。使用new表達式的時候,先分配內存,然後再分配的內存中構造對象;使用delete表達式的時候,調用析構函數撤銷對象,然後將內存返還系統。
2. 現在C++程序一般應該使用allocator類來分配內存,更加安全和靈活。allocator類是一個模板,將內存分配和對象構造分離開。比如,可以用allocator類的allocate()方法分配內存,然後用construct()方法來構造對象;用destroy()來析構對象,再用deallocate()來釋放內存。
3. new表達式的過程:首先調用operator new函數來分配足夠大的內存,然後運行該類型的構造函數來構造對象,最後返回指向新分配並構造的對象的指針。
4. 雖然operator new和operator delete函數的設計意圖是提供給new和delete表達式使用來管理內存分配,但是也可以單獨使用。
如T*newElements=alloc.allocate(newcapacity);
也可以寫成T* newElements=static_cast<T*> (operator new[] (newcapacity*sizeof(T)));
operator new和delete函數與allocator類的操作的不同在於,它們是對void*指針而不是類型化指針的操作,所以需要static_cast.
5. 定位new表達式:在已分配的內存中初始化一個對象,並不經過內存分配階段。
new (place_address) Type (initialize_list)
6. 運行時類型識別RTTI,通過兩個操作符來提供RTTI:
typeid操作符,返回指針或引用所指對象的實際類型
dynamic_cast操作符,將基類類型的指針或引用安全轉換爲派生類型的指針或引用。
7. dynamic_cast將基類類型對象的引用或指針轉換爲同一繼承層次中其他類型的引用或指針。如果綁定的對象不是目標類型的對象,則dynamic_cast失敗。如果是轉換成指針的失敗,則結果是0值;如果是轉換成引用的失敗,則拋出bad_cast異常。
8. typeid使程序能得到一個表達式的類型,使用方法是typeid(e),e是任何類型的表達式或類型名。如果操作數不是類類型或者是沒有虛函數的類,則typeid操作符指出其靜態類型;如果操作數是定義了至少一個虛函數的類類型,則在運行時計算類型。
typeid最常見的用途是比較兩個表達式的類型,或者將表達式與特定類型相比較。
9. 類成員指針,指向類的成員變量或者函數。成員指針包含類的類型以及成員的類型。
比如一個A類的string類型成員的指針是:string A::*pointer_name;
成員函數的指針:string(A::*pointer_name) (parameter_list);
10. 可以爲成員指針定義別名,如:
typedef string (A::*Name)(parameter_list) const;
在使用的時候,可以直接定義Namea;來定義a作爲一個指針。
11. 嵌套類是獨立的類,基本上與外圍類不相關。嵌套類的名字在其外圍類的作用域中可見,但在其他類作用域或定義外圍類的作用域中不可見。外圍類對嵌套類的成員沒有特殊訪問權,嵌套類對其外圍類的成員也沒有特殊訪問權。
在外圍類的public部分定義的嵌套類,可以在任何地方使用,在protected定義的嵌套類,只能由外圍類、友元、派生類訪問,在private定義的嵌套類,只能被外圍類和友元訪問。
12. 在嵌套類外部定義的嵌套類成員,不能定義在外圍類內部,而應該定義在定義外圍類的作用域中。
13. 聯合union是一種特殊的類,一個union對象可以有多個數據成員,但是任何時刻,只有一個成員可以有值,其他的都屬於未定義。
14. 像任何類一樣,union可以指定保護標記使成員成爲public、private或protected。默認情況下,都是public成員。
union可以定義成員函數,包括構造函數和析構函數。但是,不能作爲基類使用。union不能具有靜態數據成員或引用成員,而且重要的是,不能有定義了構造函數、析構函數或賦值操作符的類類型的成員。
15. 匿名聯合,不用於定義對象的未命名聯合。調用匿名聯合成員時,直接將其作爲定義該union作用域的一部分訪問。如:
class token{
union {
char c;
int I;
double d;
}
}
token k;
在訪問的時候,直接用k.c來訪問第一個成員。
匿名union不能有private或protected成員,也不能定義成員函數。
16. 可以在函數體內部定義類,稱爲局部類。
局部類只在定義它的函數作用域中可見。
局部類所有成員(包括函數)的定義必須在該類內部。
局部類沒有static成員。
局部類只能訪問在外圍作用域中定義的類型名、static變量和枚舉成員,不能使用該函數中的變量。
17. 從C語言繼承來的不可移植的特徵:位域和volatile限定符。
18. 位域是一種特殊的類數據成員,保存特定的位數。當程序需要將二進制數據傳遞給另一個程序或者硬件設備的時候,通常使用位域。
位域在內存中的佈局是機器相關的。
位域必須是整形數據類型,可以使signed或者unsigned。通過在成員名後接一個冒號以指定位數。如:
class a{
unsigned int mode: 2;
}
19. 直接處理硬件的程序會有這樣的數據成員,它們的值由程序本身直接控制之外的過程所控制。當可以用編譯器控制或者檢測之外的方式改變對象值的時候,應該將對象聲明爲volatile。編譯器將不對這些對象進行優化。
20. 不能使用合成的複製和賦值操作符,從volatile對象進行初始化和賦值。例如,不能將volatile對象傳遞給普通引用或者const引用。
21. 鏈接指示:extern “C”。
當把include指示放在複合鏈接指示的花括號中時,則認爲被include的頭文件中的所有普通函數聲明都是用鏈接指示的語言編寫的函數。
22. 可以聲明鏈接指示的指針,如:
extern “C” void (*pf) int;
C函數的指針與C++的指針具有不同的類型,不能互相初始化或者賦值。
23. C語言不支持函數重載。