static 靜態變量和靜態成員函數:
1)靜態變量和靜態函數是屬於整個類的而不是某個對象,其只存儲一份地址供所有對象共用;
2)使用靜態成員變量實現多個對象之間的數據共享不會破壞隱藏的原則,保證了安全性還可以節省內存;
3)靜態成員函數不能調用非靜態成員變量和非靜態成員函數,因爲靜態成員函數屬於整個類,在類實例化對象之前就已經分配空間了,而類的非靜態成員必須在類實例化對象後纔有內存空間,就好比沒有聲明一個變量卻提前使用它一樣;
4)非靜態成員函數可以調用靜態成員變量和函數;
5)靜態成員變量在使用前必須初始化,且在類外初始化(類型名 類名::靜態變量名=實值),靜態成員變量不能在構造函數中初始化(我的程序是這樣的 編譯沒有錯誤 但是運行出錯);
6)靜態成員變量能被任何類對象所修改;
7)靜態常量(static const)在類中定義時就必須初始化,且不能被任何類對象所修改。
friend 友元函數:
1)友元函數在類中定義,但不是類的成員函數(包括重載函數),友元函數可以在類內部實現也可在外部實現,在外部實現不需要加類的作用符;
如:
class a
{
friend void aaa();
}
void aaa()
{cout<<"aaa"<<endl;}
2)因爲友元函數可以訪問類的私有變量,所以友元函數在一定程度上破壞了類的封裝性和隱藏性;
3)關鍵字friend在實現運算符重載時,一般用於左移(<<)和右移(>>)操作,不用於其它操作符的重載使用,否則報錯;
4)友元函數不能實現重載。
析構函數:
1)析構函數爲系統在相應程序或對象執行完畢後,自動執行的一種釋放資源的函數,不能具有參數;
2)嚴格講析構函數在編譯器編譯的時候會分配一個this指針,也就意味着可以賦予參數,但由於其是系統自動調用執行的函數,賦予參數的話無法爲其傳遞實參而且造成編譯器錯誤 故析構函數不能含參數。
重載、重寫、重定義:
1)函數重載
必須在同一個類中;
子類無法重載父類的函數,父類同名函數將被名稱覆蓋;
重載是在編譯期間根據參數類型和個數決定函數調用。
2)函數重寫
必鬚髮生在子類和父類之間;
並且子類與父類中的函數必須有完全相同的原型;
使用virtual聲明之後的函數在子類中爲重寫,能夠產生多態(不使用virtual聲明的函數,爲重定義);
多態是在運行期間根據具體對象的類型決定函數調用。
注意:子類中存在與父類名稱相同的函數,那麼覆蓋父類函數名,要麼重寫(重寫條件是函數名和函數參數與父類相同),如父類有parent(int a)子類有parent(int a, int b)無論是否存在virtual關鍵字都將覆蓋父類函數名(即子類對象在調用parent函數時只在子類中尋找,不在父類中尋找,若執行父類parent函數 使用作用符 如a.parent::parent(int a))。
繼承:
1)子類(public 或 protected 繼承)可以訪問父類的成員函數和變量(不能訪問父類的私有成員),若子類使用private繼承父類,則不能訪問父類任何成員;
2)繼承的析構順序與構造函數的調用順序正好相反,先析構自己的,再析構父類的;
繼承中構造函數調用順序:
1)如果繼承虛基類,先調用虛基類的構造函數,如果有多個虛基類,按順序調用。
2)如果繼承基類,調用基類的構造函數;如果有多個基類,按順序調用。
3)如果類中定義了成員對象,調用成員對象的構造函數;如果有多個成員對象,則按成員對象定義的順序調用;
4)調用自身的構造函數