c++ programming language 10.2.4中提到一句話:靜態成員,包括函式和資料成員,都必須在某個地方另行定義,「另行」究竟指的是什麼意思呢?
如果把包含有static成員的類的定義放在標頭檔案中,而在原始檔中呼叫這個static成員變數將無法通過編譯,正確的做法是在相應的原始檔中重新定義這個類成員變數
以下就是我做的一些嘗試:
1 /*
2 * file: main.cc
3 * author: 龍泉居士
4 * date: 2012-10-16 03:21
5 */
6 7 #include
8 9 using namespace std;
10 11 class c
12 19 };
20 21 int main ()
22 報出了main.cc:11: undefined reference to `c::x'的鏈結期錯誤,原因是x作為static成員變數沒有在類外定義。
1 /*
2 * file: main.cc
3 * author: 龍泉居士
4 * date: 2012-10-16 03:24
5 */
6 7 #include
8 9 using namespace std;
10 11 class c
12 19 };
20 21 static int c::x = 4;
22 23 int main ()
24 報出了main.cc:15: error: 『static』 may not be used when defining (as opposed to declaring) a static data member的編譯期錯誤,這又是為什麼呢?
1 /*
2 * file: main.cc
3 * author: 龍泉居士
4 * date: 2012-10-16 03:25
5 */
6 7 #include
8 9 using namespace std;
10 11 class c
12 19 };
20 21 int c::x = 4;
22 23 int main ()
24 這次編譯鏈結通過,程式運轉正常,原來2中的問題是在類外定義static變數時要省去static關鍵字
1 /*
2 * file: main.cc
3 * author: 龍泉居士
4 * date: 2012-10-16 03:27
5 */
6 7 #include
8 9 using namespace std;
10 11 class c
12 19 };
20 21 int main ()
22 這一次又報出了main.cc:17: error: invalid use of qualified-name 『c::x』的錯誤,原來static變數在編譯單元內的定義必須是全域性的
必須在某個地方另行定義,但static成員函式可以在類內定義
static成員變數必須在類外定義,且必須在編譯單位的全域性內進行定義,不能定義在某個域內,如函式等
static成員(包括變數和函式),在類外重新定義時,必須省略原有的static關鍵字
C 類static 成員的使用
靜態成員屬於類,但不屬於物件所有。例如類a中含有乙個靜態成員static a,那麼所有的a的物件都可以共享a 靜態成員的提出是為了解決資料共享的問題。實現共享有許多方法,如 設定全域性性的變數或物件是一種方法。但是,全域性變數或物件是有侷限性的。這一章裡,我們主要講述類的靜態成員來實現資料的共享。類...
c 類中的static成員
概念 宣告為static的類成員稱為類的靜態成員 用static修飾的成員變數為,靜態成員變數,用static修飾的成員函式為,靜態成員函式。靜態成員變數一定要在類外進行初始化。特性 1 靜態成員為所有類物件所共享,不屬於某個具體的例項 2 靜態成員必須在類外定義 3 類靜態成員可以用 類名 靜態成...
C 之static類成員,static類成員函式
0.static修飾類中成員,表示類的共享資料 1.static類成員 在c primer裡面說過,static類成員不像普通的類資料成員,static類資料成員獨立於一切類物件處在。static類資料成員是與類關聯的,但不與該類定義的物件有任何關係。這句話什麼意思?就是static不會想普通類資料...