C++類靜態成員與類靜態成員函數詳解__Jquery
來源:互聯網
上載者:User
靜態成員不可在類體內進行賦值,因為它是被所有該類的對象所共用的。你在一個對象裡給它賦值,其他對象裡的該成員
也會發生變化。為了避免混亂,所以不可在類體內進行賦值
當將類的某個資料成員聲明為static時,該待用資料成員只能被定義一次,而且要被同類的所有對象共用。各個對象都擁有
類中每一個普通資料成員的副本,但待用資料成員只有一個執行個體存在,與定義了多少類對象無關。靜態方法就是與該類相關的,
是類的一種行為,而不是與該類的執行個體對象相關。
待用資料成員的用途之一是統計有多少個對象實際存在。
待用資料成員不能在類中初始化,實際上類定義只是在描述對象的藍圖,在其中指定初值是不允許的。也不能在類的建構函式
中初始化該成員,因為待用資料成員為類的各個對象共用,否則每次建立一個類的對象則待用資料成員都要被重新初始化。
靜態成員不可在類體內進行賦值,因為它是被所有該類的對象所共用的。你在一個對象裡給它賦值,其他對象裡的該成員也
會發生變化。為了避免混亂,所以不可在類體內進行賦值。
靜態成員的值對所有的對象是一樣的。靜態成員可以被初始化,但只能在類體外進行初始化。
一般形式:
資料類型類名::待用資料成員名=初值
注意:不能用參數初始化表對靜態成員初始化。一般系統預設初始為0。
靜態成員是類所有的對象的共用的成員,而不是某個對象的成員。它在對象中不佔用儲存空間,這個屬性為整個類所共有,
不屬於任何一個具體對象。所以靜態成員不能在類的內部初始化,比如聲明一個學生類,其中一個成員為學生總數,
則這個變數就應當聲明為靜態變數,應該根據實際需求來設定成員變數。
代碼如下:
#include "iostream"
using namespace std;
class test
{
private:
int x;
int y;
public:
static int num;
static int Getnum()
{
//x+=5; // 這行代碼是錯誤的,靜態成員函數不能調用非待用資料成員,要通過類的對象來調用。
num+=15;
return num;
}
};
int test::num = 10;
int main(void)
{
test a;
cout<<test::num<<endl; //10
test::num = 20;
cout<<test::num<<endl; //20
cout<<test::Getnum()<<endl; //35
cout<<a.Getnum()<<endl; //50
system("pause");
return 0;
}
通過上例可知: x+=5; // 這行代碼是錯誤的
靜態函數成員必須通過對象名來訪問非待用資料成員。
另外,靜態成員函數在類外實現時候無須加static關鍵字,否則是錯誤的。
若在類的體外來實現上述的那個靜態成員函數,不能加static關鍵字,這樣寫就可以了:
代碼如下:
int test::Getnum()
{
.........
}
1、static成員的所有者是類本身和對象,但是多有對象擁有一樣的靜態成員。從而在定義對象是不能通過建構函式對其進行初
始化。
2、靜態成員不能在類定義裡邊初始化,只能在class body外初始化。
3、靜態成員仍然遵循public,private,protected訪問準則。
4、靜態成員函數沒有this指標,它不能返回非靜態成員,因為除了對象會調用它外,類本身也可以調用。
靜態成員函數可以直接存取該類的待用資料和函數成員,而訪問非待用資料成員必須通過參數傳遞的方式得到一個對象名,
然後通過對象名來訪問。
代碼如下:
class Myclass
{
private:
int a,b,c;
static int Sum; //聲明待用資料成員
public:
Myclass(int a,int b,int c);
void GetSum();
};
int Myclass::Sum=0; //定義並初始化待用資料成員
Myclass::Myclass(int a,int b,int c)
{
this->a=a;
this->b=b;
this->c=c;
Sum+=a+b+c;
}
void Myclass::GetSum()
{
cout <<"Sum=" <<Sum <<endl;
}
int main(void)
{
Myclass me(10,20,30);
me.GetSum();
system("pause");
return 0;
}
由上例可知,非靜態成員函數可以任意地訪問靜態成員函數和待用資料成員。
非靜態成員函數Myclass(int a,int b,int c)和GetSum()都訪問了待用資料成員Sum。
靜態成員函數不能訪問非靜態成員函數和非待用資料成員。
關於靜態成員函數,可以總結為以下幾點:
出現在類體外的函數定義不能指定關鍵字static;
靜態成員之間可以相互訪問,包括靜態成員函數訪問待用資料成員和訪問靜態成員函數;
非靜態成員函數可以任意地訪問靜態成員函數和待用資料成員;
靜態成員函數不能訪問非靜態成員函數和非待用資料成員;
由於沒有this指標的額外開銷,因此靜態成員函數與類的全域函數相比速度上會有少許的增長;
調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指標調用靜態成員函數,當同一類的所有
對象使用一個量時,對於這個共用的量,可以用待用資料成員變數,這個變數對於同一類的所有的對象都取相同的值。靜態成
員變數只能被靜態成員函數調用。靜態成員函數也是由同一類中的所有對象共用。只能調用靜態成員變數和靜態成員函數。