1. 參考 1. 《C++程序設計語言》4.9 2. 《C++Primer》2.3.5 3. http://bbs.csdn.net/topics/190026622 2. 概念 2.1 聲明 聲明用於向程序表明變量的類型和名字。(引自參考2) 2.2 定義 變量的定義用於為變量分配存儲空間,還可以為變量指定初始值。在一個程序中,變量有且僅有一個定義。 3. 對比 定義是聲明,聲明大部分是定義,少數情況不是定義。 聲明 定義 非定義 定義 是否可以出現多次? 是 否 否 是否有內存分配? 沒有 有 有 是否可以直接使用該變量? 不能 能 能 是否知道它的構成? 不一定知道 知道 知道 3.1 聲明但不是定義的情況 除了下面三種情況,聲明全都是定義。 3.1.1 聲明來自其他文件的非初始化變量 extern int i; // 這是聲明不是定義,變量i的定義在其他文件中 注意:如果對來自其他文件的變量進行初始化,那麼這就是定義 extern int i = 10; // 這是聲明且是定義 3.1.2 聲明類型 struct User; // 這是聲明不是定義 3.1.3 聲明方法 double _sqrt(double); // 這是聲明不是定義 3.2 聲明且是定義的情況 復制代碼 int i; char ch; string s; int count = 1; const double pi = 3.14; const char *name = "Njal"; const char *season[] = {"spring", "summer", "fall", "winter"}; struct Date { int d, m, y; }; int day(Date *p) { return p->d; }; template <typename T> T _abs(T a) { return a < 0 ? -a : a; } enum Beer { Carlsberg, Tuborg, Thor}; namespace NS { int a; }; 復制代碼 3.3 特殊情況 3.3.1 使用extern修飾變量,且初始化 extern int i = 10; // 這是定義 3.3.2 使用typedef 這是個糾結的問題,我現在還沒想明白,如果你知道請回復我,謝謝。 C++的作者認為 typedef comple<short> Point; // C++的作者認為這是定義 但是對於這種情況呢? struct User; // 這是聲明非定義 typedef User USER; // 這是不是定義呢? 3.3.3 類定義中的成員變量 struct Date { int y; // 這是定義 } 下面是關於聲明與定義的帖子的一個回復以及我的觀點,讀者可以參考。 論壇上某人的回復如下。(引自參考3) 復制代碼 1. 變量和對象不加extern永遠是定義,類中的除外. 2. 函數只有函數頭是聲明,有函數體是定義. 3. 類永遠只是聲明.類成員函數的函數體是定義. class C { static int x;//這裡的x是聲明 static const int a;;//這裡的a是聲明 //非static變量在類定義對象時才分配內存. C();//這裡的函數是聲明 }; int C::x;//這個才是定義 const int C::a=11;//這個才是定義 復制代碼 我的觀點: 復制代碼 1. "變量和對象不加extern永遠是定義"是片面的,例如特殊情況extern int i = 10就是定義。 "變量和對象不加extern永遠是定義,類中的除外",我認為類中的變量和對象也是聲明。 2. "函數只有函數頭是聲明,有函數體是定義.",我認為是正確的。 3. "類永遠只是聲明.類成員函數的函數體是定義.",我認為類永遠都是定義。 class C { static int x;//這裡的x是定義 static const int a;//這裡的a是定義 C();//這裡的函數是聲明 }; int C::x;//這個是初始化 const int C::a=11;//這個是初始化