一、變量定義:
用於為變量分配存儲空間,用於存放對應類型的數據,變量名就是對相應的內存單元的命名,還可為變量指定初始值。程序中,變量有且僅有一個定義。
二、變量聲明:
用於向程序表明變量的類型和名字,但聲明不一定引起內存的分配。定義也是聲明:當定義變量時我們聲明了它的類型和名字。
extern int x; //對象object聲明
std::size_t numDigits(int number); //函數聲明
class widget; //class聲明
template<typename T>
class GraphNode; //模板template聲明
三、初始化:
初始化是給對象賦予初值的過程,初始化由構造函數執行。所謂的default構造函數是一個可被調用而不帶任何實際參數者,這樣的構造函數要不沒有參數,要不就是每個參數都有缺省值。
1.定義也是聲明,extern聲明不是定義,即不分配存儲空間。extern告訴編譯器變量在其他地方定義了。
extern int i; //聲明,不是定義
int i; //聲明,也是定義
2.如果聲明有初始化式,就被當作定義,即使前面加了extern。只有當extern聲明位於函數外部時,才可以被初始化。
extern double pi=3.1416; //定義
3.函數的聲明和定義區別比較簡單,帶有{ }的就是定義,否則就是聲明。
extern double max(double d1,double d2); //聲明,此時extern可去掉
程序設計風格:
- 不要把變量定義放入.h文件,這樣容易導致重復定義錯誤。
- 盡量使用static關鍵字把變量定義限制於該源文件作用域,除非變量被設計成全局的。
- 可以在頭文件中聲明一個變量,在用的時候包含這個頭文件就聲明了這個變量。
總結:
1.變量在使用前就要被定義或者聲明。
2.在一個程序中,變量只能定義一次,卻可以聲明多次。
3.定義分配存儲空間,而聲明不會。
注:有三個例外,以下三種實體的定義也可放到頭文件中。
- 值在編譯時就已知的const 變量的定義可以放到頭文件中
const int num = 10;
-
類的定義可以放到頭文件中
-
inline 函數
這三個實體可以定義在多個源文件中,只要在每個源文件中的定義相同