1. 程式人生 > >靜態成員變數與普通成員變數的區別

靜態成員變數與普通成員變數的區別

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;
}

總結:假如我們要在一個類中的所有物件間共享某種資料,不如將該資料宣告為靜態成員變數。假如你不想讓該類之外的所有函式都可以訪問該資料,可將其定義為私有成員,那麼就只有該類的公有成員才可以訪問它了。訪問的前提是必須建立一個屬於該類的物件。