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();
};