extern 關鍵字 static關鍵字 virutal 關鍵字
extern
1、宣告外部變數
extern 用來修飾變數或者函式名,用以在一個檔案中定義,但是可以在其他檔案中進行使用的。
例如在A檔案中定義了 全域性變數 int mm=0;你在另一個檔案B中也定 定義了 int mm=0; 編譯時時候不會出錯,因為編譯時以檔案為單位作用域在本檔案中。但是在連結是後出錯,因為他會將多檔案進行合併生成obj 全域性變數的儲存空間合併為一塊兒,導致重名;如果加上extern 的話就會連結放行,認為是一個變數。
2、在C++檔案中呼叫C方式編譯的函式
C方式編譯和C++方式編譯相對於C,C++中新增了諸如過載等新特性,編譯時候會生成一個由函式名引數組成的中間函式名用來檢查過載特性。而C語言編譯不會這樣。導致C++中如果呼叫C語言介面會不認識,那麼extern ‘C’ 就有用了告訴編譯器,這段程式碼用C編譯器編譯。那麼自然而然呼叫的時候就認識了。
static
1.靜態全域性變數有以下特點:
• 該變數在全域性資料區分配記憶體;
• 未經初始化的靜態全域性變數會被程式自動初始化為0(自動變數的值是隨機的,除非它被顯式初始化);
• 靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的;
2.
• 靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;
• 由於沒有this指標的額外開銷,因此靜態成員函式與類的全域性函式相比速度上會有少許的增長;
virtual
1.多型實現
2.包含一個或多個純虛擬函式的類被編譯器識別為抽象基類。抽象基類不能被例項化,一般用於繼承。抽象基類只能作為子物件出現在後續的派生類中
3.虛繼承
在多繼承下,虛繼承就是為了解決菱形繼承中,B,C都繼承了A,D繼承了B,C,那麼D關於 A的引用只有一次,而不是 普通繼承的 對於A引用了兩次……
格式:可以採用public、protected、private三種不同的繼承關鍵字進行修飾,只要確保包含virtual就可以了。
class A
{
void f1(){};
};
class B : public virtual A{
void f2(){};
};
class c:public virutal A{
public:
void f3();
};