class Foo
{
public:
static int a;
stataic void func();
}
靜態資料成員和函式都是在宣告前加static
靜態成員必須要在類外初始化,無法在建構函式內初始化。新標準的C++也允許在生命靜態資料成員的是後直接加等於號進行初始化,但是大部分編譯器不支援。所以最保險的辦法就是在類定義的外面再寫:
int Foo::a = 0;
注意,這時候不需要再static了。
函式則很普通成員函式的宣告以及實現沒區別,唯一要注意的是,靜態函式是沒有this指標的,因此不能訪問任何非靜態的其他成員函式或成員變數,如果要訪問需要傳遞this指標進去,比如
int a;
static void func(Foo* ptrFoo)
a = 0; // 錯誤!!!a不是靜態變數,無法訪問!
ptrFoo->a= 0; //正確。
void test()
// 非靜態成員函式呼叫靜態成員函式可以傳遞this指標,讓靜態成員函式透過他來訪問
// 其他成員函式和成員變數。
Foo::func(this);
class Foo
{
public:
static int a;
stataic void func();
}
靜態資料成員和函式都是在宣告前加static
靜態成員必須要在類外初始化,無法在建構函式內初始化。新標準的C++也允許在生命靜態資料成員的是後直接加等於號進行初始化,但是大部分編譯器不支援。所以最保險的辦法就是在類定義的外面再寫:
int Foo::a = 0;
注意,這時候不需要再static了。
函式則很普通成員函式的宣告以及實現沒區別,唯一要注意的是,靜態函式是沒有this指標的,因此不能訪問任何非靜態的其他成員函式或成員變數,如果要訪問需要傳遞this指標進去,比如
class Foo
{
public:
int a;
static void func(Foo* ptrFoo)
{
a = 0; // 錯誤!!!a不是靜態變數,無法訪問!
ptrFoo->a= 0; //正確。
}
void test()
{
// 非靜態成員函式呼叫靜態成員函式可以傳遞this指標,讓靜態成員函式透過他來訪問
// 其他成員函式和成員變數。
Foo::func(this);
}
}