天天看點

C++聲明和定義的差別

        聲明是告知編譯器該程式元素的名稱以及類型,定義則是使編譯器為程式元素配置設定記憶體空間。二者最根本的差別就是是否配置設定記憶體。聲明不會導緻記憶體的配置設定,而定義會配置設定記憶體。在C++程式中聲明可以有多次,但是定義隻能有一次。是以不能将變量的定義放置于頭檔案中,由于頭檔案會被多次引用,就會導緻變量在多個源檔案中被重複定義,這是C++所不允許的。但是也有例外的情況,以下3種定義可以放入頭檔案中:

           a. 類的定義。

           b. const變量的定義。因為const常量的作用域僅限于定義它的檔案,是以可以在多個源檔案中出現它的定義。

           c. inline函數。

        聲明可以充當為定義,除非是以下幾種情況:

           a. 函數原型(無函數體的函數聲明)。

           b. 包含extern關鍵字并且沒有初始化變量、對象或函數體。例如:

extern int i; //聲明
extern int p = 123; //定義
           

           c.  沒有下列定義的類名聲明,如Class T;

           d. 類聲明中的靜态資料成員。例如:

class abc{
   static const int i = 10; //常量聲明式
   int ui[i];  //使用該常量
};
           

        值得注意的是,你看到的是i的聲明式而非定義式。C++會要求你為所使用的任何東西提供定義式,但是如果它是class的專屬常量且是static且為int類型時,可以差別對待。如果不取它的位址,你可以聲明并使用它們而無需提供定義式。但是如果你要取它的位址或是編譯器并不認可這種行為,你需要在實作檔案中添加如下代碼:

const int abc::i;
           

        如果你的編譯器不支援以上文法,即不允許static成員在其聲明式中獲得初值,你可以将初值放在定義式内。

class abc{
   static const int i; //常量聲明式
   ......
};
abc::i = 10;
           

       但是如果你的class在編譯期間需要一個class常量值,例如編譯器需要知道ui數組的大小。這時你可以使用enum來彌補。

class abc{
   enum { i = 10 };
   int ui[i]; 
};
           

繼續閱讀