1.C++虛函數的工作原理
虛函數(virtual function)需要虛函數表(virtual table)才能實現。如果一個類有函數聲明成虛擬的,就會生成一個虛函數表,存放這個類的虛函數地址。若子類沒有覆寫虛函數,該子類的虛函數表就會存放父類的函數地址。調用這個虛函數時,就會通過虛函數表解析函數的地址。在C++中,動態綁定(dynamic bindding)就是通過虛函數表機制實現的。
2.深拷貝和淺拷貝的區別
淺拷貝會將對象所有成員的值拷貝到另一個對象裡。使用淺拷貝時,必須非常小心,只有當我們知道自己在做什麼時才可選用淺拷貝。多數情況下,使用淺拷貝是為了傳遞一塊復雜結構的信息,但又不想真的復制一份數據。使用淺拷貝時,銷毀對象也必須非常小心。
深拷貝除了拷貝所有成員的值,還會進一步拷貝所有的指針對象。
在實際開發中,淺拷貝很少使用。大部分情況都應該使用深拷貝,特別是當需要拷貝的結構很小時。
1 struct Test 2 { 3 char * ptr; 4 }; 5 6 void shallowCopy(Test & src , Test & dest) 7 { 8 dest.ptr = src.ptr; 9 } 10 11 void deepCopy(Test & src , Test & dest) 12 { 13 dest.ptr = (char * ) malloc(strlen(src.ptr) + 1 ); 14 strcpy(dest.ptr , src.ptr); 15 }
3.C語言的關鍵字“volatile”的作用
關鍵字volatile的作用是指示編譯器,即使代碼不對變量做任何改動,該變量的值仍可能會被外界修改。操作系統、硬件或其他線程都有可能修改該變量。該變量的值有可能遭受意料之外的修改。所以,每次使用時,編譯器都會重新從內存中獲取這個值。
volatile的整數聲明語句:
1 int volatile x; 2 volatile int x;
聲明指向volatile整數的指針:
volatile int * x; int volatile * x;
指向非volatile數據的volatile指針很少見,但也是可行的:
int * volatile x;
如果聲明指向一塊volatile內存的volatile指針變量(指針本身與地址所指向的內存都是volatile),volatile變量不會被優化掉。
int volatile * volatile x;
volatile變量在多線程程序裡很有用,對於全局變量,任意線程都可能修改這些共享的變量。我們可能不希望編譯器對這些變量進行優化,我們就可以使用volatile關鍵字。
4.C++基類的析構函數聲明為virtual的原因
確保正確調用繼承關系最末端的子類的析構函數。