靜態成員變數與普通成員變數的區別
1.靜態成員變數是屬於整個類的全域性變數,它不單屬於某一個物件;普通成員變數是屬於類中的物件,它不能被所有物件共享。如:
class A{
public:static int x;
};
int A::x=10;//注意在定義靜態成員變數x的時候也要加上類名和限定符(A::)。
int main(){
A a,b,c;
cout<<a.x<<endl<<b.x<<endl<<c.x<<endl;
return 0;
}
輸出:10 10 10
2.靜態成員變數必須在全域性進行定義,而由於普通成員變數在建立一個物件的時候可以對它進行初始化,因此就不需要單獨對它進行定義,只要宣告即可。
3.靜態成員變數在沒有物件之前就存在。如:
#include <iostream>
using namespace std;
class A{
public:
static int n;
};
int A::n=0;
void show(){cout<<A::n<<"a \n";}
int main(){
int i;
for(i=0;i<5;i++){
A::n++;
show();
}
return 0;
}
輸出:1a 2a 3a 4a 5a
該例沒有建立一個物件,但是去可以通過類名和限定符訪問靜態變數n,並且對其進行自加操作,這說明靜態變數在沒有物件之前就存在。
以上講的靜態成員變數都是公有的,因此程式中的所有函式都可以訪問,假如我們不想讓所有的函式都訪問它,則可以將它宣告為私有,這樣就只有通過該類的公有成員函式才能訪問它,但前提是比必須建立該類的一個物件。
#include <iostream>
using namespace std;
class A{
public:
void func(){cout<<A::n;}
private:
static int n;
};
int A::n=1000;
int main(){
A a;
a.func();
return 0;
}
總結:假如我們要在一個類中的所有物件間共享某種資料,不如將該資料宣告為靜態成員變數。假如你不想讓該類之外的所有函式都可以訪問該資料,可將其定義為私有成員,那麼就只有該類的公有成員才可以訪問它了。訪問的前提是必須建立一個屬於該類的物件。