1. 函數的調用是依賴指針的原始類型而不管它實際指向何方。
2. 虛函數是在程序執行期進行的動態綁定或後期綁定;而非虛函數是程序在編譯時間進行的靜態綁定或前期綁定。
3. 純虛擬函數不需定義其實際動作,它的存在只是爲了在衍生類別中被重新定義,只是爲
了提供一個多態接口。只要是擁有純虛擬函數的類別,就是一種抽象類別,它是不能夠
被具象化的,也就是說,你不能根據它產生一個對象。
virtual void display() = 0; // 注意"= 0"
4. 抽象類別不能產生出對象實體,但是我們可以擁有指向抽象類別之指針。
5. 虛擬函數衍生下去仍爲虛擬函數,而且可以省略virtual 關鍵詞。
6. 每一個「內含虛擬函數的類別」,編譯器都會爲它做出一個虛擬函數表,表中的每一筆元素都指向一個虛擬函數的地址。此外,編譯器當然也會爲類別加上一項成員變量,是一個指向該虛擬函數表的指針vPtr(佔4個字節)。
7. 類對象的內存區塊中不能看到任何與成員函數有關的任何東西。
8. (CDocument*)(&mydoc))->func()只是把指針的類型改變了,並沒有改變指針所指向的內容類型,所以會調用指針原來指向的函數。(CDocument)mydoc).func()下上的強制類型轉換會造成對象切割,因此會調用CDocument類型中的函數。
9. 靜態成員變量在使用前,必須初始化,並且初始化不受private權限的控制。不要把static成員變量的初始化放在構造函數或頭文件中,因爲構造函數或頭文件可能被調用多次。應該放在main函數或全局函數中,或任何函數之外。
class SavingAccount
{
private:
char m_name[40]; // 存戶姓名
char m_addr[60]; // 存戶地址
double m_total; // 存款額
static double m_rate; // 利率
...
public:
static void setRate(double newRate) { m_rate = newRate; }
...
};
double SavingAccount::m_rate = 0.0075; // 設置 static 成員變量的初值
10. 如果你希望在產生任何object 之前就存取其class 的private static 成員變量,則必須設計一個static 成員函數。
11. C++ 的new 運算子和C 的malloc 函數都是爲了配置內存,但前者比之後者的優點是,new 不但配置對象所需的內存空間時,同時會引發構造式的執行。
12. 當衍生類別的對象誕生之時,構造式的執行是由最基礎類別至最尾端衍生類別;當對象要毀滅之前,析構式的執行則是反其道而行。
13. 對於靜態(static)對象,當對象誕生時其構造式被執行;當程序將結束時(此對象因而將遭致毀滅)其析構式才被執行,但比全域對象的析構式早一步執行。
14. 四種不同的對象生存方式:
1) 堆棧(stack)之中產生它:
void MyFunc()
{
CFoo foo; // 在堆棧(stack)中產生foo 對象
...
}
2) 在堆積(heap)之中產生它:
void MyFunc()
{
...
CFoo* pFoo = new CFoo(); // 在堆(heap)中產生對象
}
3) 產生一個全域對象(同時也必然是個靜態對象):
CFoo foo; // 在任何函數範圍之外做此動作
4) 產生一個區域靜態對象:
void MyFunc()
{
static CFoo foo; // 在函數範圍(scope)之內的一個靜態對象
...
}
15. 執行時期型別信息(Runtime Type Information,RTTI): 在程序執行過程中知道某個對象是屬於哪一種類別。使用方法:首先包含typeinfo.h,其次使用typeid運算子。
typeid(GIFimage) == typeid(*type) //GIFimage是類型名,type是對象。
編譯時需選用/GR 選項。// RTTI.CPP - built by C:/> cl.exe -GR rtti.cpp <ENTER>
16. 動態生成這段沒看懂。~
這筆記寫了有一段時間了,一直沒放上來!