宣告和定義 (C++)
宣告會告知編譯器其中存在程式項目或名稱。 定義則會指定名稱所描述的程式碼或資料。 必須先宣告名稱,才能使用。
宣告
宣告會將一個或多個名稱引入程式。 宣告在程式中可能會出現一次以上。 因此,您可以為每個編譯單位宣告類別、結構、列舉類型和其他使用者定義類型。 多重宣告的條件約束是,所有宣告必須相同。 宣告也可當做定義,但宣告如有下列情況則除外:
為函式原型 (沒有函式主體的函式宣告)。
包含 extern 指定名稱,但不包含初始設定式 (物件和變數) 或函式主體 (函式)。 這表示此定義不一定會位於目前的轉譯單位中,並提供外部連結的名稱。
為類別宣告內的靜態資料成員。
由於靜態類別資料成員是由類別中所有物件共用的不連續變數,因此必須在類別宣告之外定義及初始化。(如需類別和類別成員的詳細資訊,請參閱類別)。
為不含下列定義的類別名稱宣告,例如 class T;。
為 typedef 陳述式。
宣告也可做為定義的範例如下:
// Declare and define int variables i and j.
int i;
int j = 10;
// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };
// Declare class CheckBox.
class CheckBox : public Control
{
public:
Boolean IsChecked();
virtual int ChangeState() = 0;
};
某些不是定義的宣告如下:
extern int i;
char *strchr( const char *Str, const char Target );
定義
定義為物件或變數、函式、類別或列舉程式的唯一規格。 由於定義必須是唯一的,因此程式中只能包含一個特定程式項目的定義。 宣告和定義之間可以有多對一的對應關係。 在兩種情況下可以宣告但未定義程式項目:
已宣告但永遠不會使用函式呼叫或使用接受函式位址的運算式參考的函式。
只有在不知道其定義時才使用的類別。 不過,該類別必須進行宣告。 下列程式碼說明此情況:
// definitions.cpp class WindowCounter; // Forward reference; no definition class Window { // Definition of WindowCounter not required static WindowCounter windowCounter; }; int main() { }