在沒有講述本章內容之前如果我們想要在一個范圍內共享某一個數據,那麼我們會設立全局對象,但面向對象的程序是由對象構成的,我們如何才能在類范圍內共享數據呢?
這個問題便是本章的重點:
聲明為static的類成員或者成員函數便能在類的范圍內共同享,我們把這樣的成員稱做靜態成員和靜態成員函數。
下面我們用幾個實例來說明這個問題,類的成員需要保護,通常情況下為了不違背類的封裝特性,我們是把類成員設置為protected(保護狀態)的,但是我們為了簡化代碼,使要說明的問題更為直觀,更容易理解,我們在此處都設置為public。
以下程序我們來做一個模擬訪問的例子,在程序中,每建立一個對象我們設置的類靜態成員變自動加一,代碼如下:
#include <iostream>
using namespace std;
class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
count++;
}
static void Internet::Sc()//靜態成員函數
{
cout<<count<<endl;
}
Internet &Rq();
public:
char name[20];
char address[20];
static int count;//這裡如果寫成static int count=0;就是錯誤的
};
Internet& Internet::Rq()//返回引用的成員函數
{
return *this;
}
int Internet::count = 0;//靜態成員的初始化
void vist()
{
Internet a1("中國軟件開發實驗室","www.cndev-lab.com");
Internet a2("中國軟件開發實驗室","www.cndev-lab.com");
}
void fn(Internet &s)
{
cout<<s.Rq().count;
}
void main()
{
cout<<Internet::count<<endl;//靜態成員值的輸出
vist();
Internet::Sc();//靜態成員函數的調用
Internet b("中國軟件開發實驗室","www.cndev-lab.com");
Internet::Sc();
fn(b);
cin.get();
}
上面代碼我們用了幾種常用的方式建立對象,當建立新對象並調用其構造函數的時候,靜態成員cout便運行加1操作,靜態成員的初始化應該在主函數調用之前,並且不能在類的聲明中出現,通過運行過程的觀察我們發現,靜態成員count的狀態並不會隨著一個新的對象的新建而重新定義,盡而我們了解到類的靜態成員是屬於類的而不是屬於哪一個對象的,所以靜態成員的使用應該是類名稱加域區分符加成員名稱的,在上面的代碼中就是Internet::count,雖然我們仍然可以使用對象名加點操作符號加成員名稱的方式使用,但是不推薦的,靜態態類成員的特性就是屬於類而不專屬於某一個對象。