1、 一般來說,頭文件僅僅用於聲明,相應的定義要放在對應的cpp文件中。
聲明的內容一般可以是:1. 類定義體;2.類中的成員方法; 3. 類外的函數; 4. 類外的變量;5. 類型。
一個文件(比如main.cpp)包含(#include)了一個頭文件(比如item.h),就相當於聲明了Item.h中聲明的所有內容。
2、但是const常量,inline函數,static函數都可以在頭文件中定義。
二、cpp文件
用於定義;
定義的內容一般可以是:1、類的成員方法;2、類的靜態變量;3、類外的函數;4、類外的變量;
三、各種內容的定義總結
1. 類:類一般只在頭文件中定義,在cpp中實現其成員方法的定義。
2. 類中的成員包括:普通成員方法, static成員方法,普通成員變量,static成員變量,const成員變量,static const成員變量等。
普通成員方法——類內部聲明;可以在“類內部/頭文件中的類外部”定義(均看作inline);也可以放在cpp中定義(非inline);
static成員方法——類內部聲明;可以在“類內部/cpp中”定義,不能再“頭文件中的類外部”定義。在類外部定義的時候要去掉static關鍵字,因為類里面的static表示該成員屬於類,而文件中的static表示文件作用域,這是完全兩回事。
普通成員變量——類內部聲明和定義;只能在構造函數的初始化列表中初始化,用戶可以不進行初始化(編譯器將默認構造)。
const成員常量——類內部聲明;只能在構造函數的初始化列表中初始化,而且用戶必須自行初始化;
static成員變量——類內部聲明;只能在cpp中的各方法外部定義(且不能加static關鍵詞,原因同static成員方法),定義時可以不進行初始化,這時默認為0(也可以不定義,但若使用到了該成員變量,則必須定義,否則連接出錯);
static const整型成員變量——基本同static;特別之處在於,static const整型成員變量是唯一可以在定義的時候(即類內部)直接初始化的類成員變量;注:static 和static const不能在構造函數初始化列表中初始化,因為static關鍵字表明,它屬於類,而不是屬於對象。
3、類外的函數
普通函數——只能在cpp中定義;頭文件中可以聲明,不可以定義;其他文件中用到的時候要先聲明一下(可以用extern關鍵字,也可以不用);若寫在命名空間外面,則為全局作用域。但函數的參數的default值只具有文件作用域,且在一個文件中同一個參數只能聲明一次default值。
static函數——可以在任何文件定義,但在cpp中定義的靜態函數對於其他文件不可見,而在頭文件中定義的靜態函數在包含該頭文件的文件中可見;可以看出,static函數具有文件作用域。
內聯函數——最好只在頭文件中定義。因為同一原形(實現可能不同)的內聯函數可以在不同的cpp中重復定義,但是編譯器會把這些原形看作一個內聯函數,因此運行時會出現不確定現象。放在頭文件中可以避免這種情況。而且放在cpp中的內聯方法對於其他文件是不可見的。
4、類外的變量
const常量——可以在頭文件/cpp中定義,且定義時必須初始化;對於編譯時期可以直接用文字來替換使用到的該常量的情況(例如:const int/float等),最好在頭文件中定義;但有些情況(如const int *ptr = new int[5]),最好在cpp中定義,因為動態空間只有運行時才能確定,編譯器並不能用常量值直接代替ptr;且頭文件在多處被引用后可能帶來內存泄露、異常行為等。const在C++中具有文件作用域。在C中不是。
全局變量——只能在cpp中定義;頭文件和其他文件中可以聲明(需要extern關鍵字),不可以定義;其他文件中用到的時候必須先聲明一下。具有全局作用域。
靜態全局變量——可以在任何文件中定義,但是該變量只有文件作用域,即只在定義它的源文件中可見,其他源文件既不能聲明也不能使用該變量(因為它對於其他文件不可見)。當然,如果是在頭文件中定義的,則任何包含該頭文件的文件都可以使用該靜態全局變量。
四、存儲類型說明
static, const, 和inline——————
相同點:
static, const, inline都可以在任何文件中定義,並可以在不同的文件域范圍內多次定義,都默認為靜態存儲類型(生命期為整個程序期間),且都具有文件作用域(僅在定義出現的文件中可見);但在同一個文件域中,只能定義一次(可以聲明多次,靜態變量聲明時要去掉static,const常量聲明時必須有const,inline);
區別:
但const 只能修飾變量,inline只能修飾函數;static既可以修飾變量又可以修飾函數(因此可以推知static const只能修飾變量,static inline只能修飾函數)。
static只能在一個文件中聲明和定義,其作用域也局限於該文件;const和inline都可以在頭文件中聲明(必須有顯示的extern關鍵字),而在包含該頭文件的cpp中定義(若有多個cpp包含該頭文件,則這個const常量或inline方法只能在一個cpp中定義,否則連接時將難以確定使用哪個定義。注:實際上inline是可以在幾個包含同一個頭文件的cpp中定義的,但其定義最好相同,否則實際調用該內聯函數時的運行結果將難以預料,有些編譯器會根據編譯文件的先后順序決定選用那個定義來連接)。