c++ 類中的靜態變數
**靜態資料成員:
下面看乙個例子:
#include
class point
static void init() };
void main( void )
這樣編譯是不會有任何錯誤的。
下面這樣看
#include
class point
static void init() };
void main( void )
這樣編譯會處錯,錯誤資訊:illegal call of non-static member function,為什麼?
因為在沒有例項化乙個類的具體物件時,類是沒有被分配記憶體空間的。
好的再看看下面的例子:
#include
class point
static void init() };
void main( void )
這時編譯就不會有錯誤,因為在類的定義時,它靜態資料和成員函式就有了它的記憶體區,它不屬於類的任何乙個具體物件。
好的再看看下面的例子:
#include
class point
static void init()
private:
int x;
int y;
};void main( void )
編譯出錯:
illegal reference to data member 'point::x' in a static member function
illegal reference to data member 'point::y' in a static member function
在乙個靜態成員函式裡錯誤的引用了資料成員,
還是那個問題,靜態成員(函式),不屬於任何乙個具體的物件,那麼在類的具體物件宣告之前就已經有了記憶體區,
而現在非靜態資料成員還沒有分配記憶體空間,那麼這裡呼叫就錯誤了,就好像沒有宣告乙個變數卻提前使用它一樣。
也就是說在靜態成員函式中不能引用非靜態的成員變數。
好的再看看下面的例子:
#include
class point
static void init()
private:
int x;
int y;
};void main( void )
好的,這樣就不會有任何錯誤。這最終還是乙個記憶體模型的問題,
任何變數在記憶體中有了自己的空間後,在其他地方才能被呼叫,否則就會出錯。
好的再看看下面的例子:
#include
class point
static void init()
private:
static int x;
static int y;
};void main( void )
編譯:linking...
test.obj : error lnk2001: unresolved external symbol "private: static int point::y" (?y@point@@0ha
)test.obj : error lnk2001: unresolved external symbol "private: static int point::x" (?x@point@@0ha
)debug/test.exe : fatal error lnk1120: 2 unresolved externals
執行 link.exe 時出錯.
可以看到編譯沒有錯誤,連線錯誤,這又是為什麼呢?
這是因為靜態的成員變數要進行初始化,可以這樣:
#include
class point
static void init()
private:
static int x;
static int y;
};int point::x = 0;
int point::y = 0;
void main( void )
在靜態成員資料變數初始化之後就不會出現編譯錯誤了。
再看看下面的**:
#include
class point
static void init()
private:
static int x;
static int y;
};
C 類的靜態變數
1.必須學好英文。乙個簡單有力的理由就是查閱資料時可以不侷限於中文。2.msdn很強大,前提是必須掌握好英文。c 類的靜態變數屬於類,而不屬於類的物件。但類的物件可以使用它。如果有多個物件,則他們共享該靜態變數。類的靜態變數在類中宣告,在類外定義,即在類外賦值。最好不要在標頭檔案中定義變數,因為可能...
類模板中的靜態變數
先上 具體看輸出和注釋 編譯器並不是把函式模板處理成能夠處理任意類的函式 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 在宣告的地方對模板 本身進行編譯 在呼叫的地方對引數替換後的 進行編譯。include using namespace std template cl...
C 類中的靜態變數和靜態成員函式
靜態資料成員 下面看乙個例子 include class point public void output static void init void main void point pt pt.init pt.output 這樣編譯是不會有任何錯誤的。下面這樣看 include class poi...