二、靜態(tài)成員
可以把類的成員聲明為靜態(tài)的。靜態(tài)成員只能存在唯一的實例。所有的成員函數(shù)都可以訪問這個靜態(tài)成員。即使沒有聲明類的任何實例,靜態(tài)成員也已經(jīng)是存在的。不過類當中聲明靜態(tài)成員時并不能自動定義這個變量,必須在類定義之外來定義該成員。
1.靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員相當于一個全局變量,類的所有實例都可以使用它。成員函數(shù)能訪問并且修改這個值。如果這個靜態(tài)成員是公有的,那么類的作用域之內(nèi)的所有代碼(不論是在類的內(nèi)部還是外部)都可以訪問這個成員。下面的程序通過靜態(tài)數(shù)據(jù)成員來記錄鏈表首項和末項的地址。
#include iostream.h
#include string.h
class ListEntry
{
public:
static ListEntry* firstentry;
private:
static ListEntry* lastentry;
char* listvalue;
ListEntry* nextentry;
public:
ListEntry(char*);
~ListEntry() { delete [] listvalue;}
ListEntry* NextEntry() const { return nextentry; };
void display() const { cout< };
ListEntry* ListEntry::firstentry;
ListEntry* ListEntry::lastentry;
ListEntry::ListEntry(char* s)
{
if(firstentry==0) firstentry=this;
if(lastentry!=0) lastentry->nextentry=this;
lastentry=this;
listvalue=new char[strlen(s)+1];
strcpy(listvalue,s);
nextentry=0;
}
int main()
{
while (1)
{
cout<<\nEnter a name ('end' when done): ;
char name[25];
cin>>name;
if(strncmp(name,end,3)==0) break;
new ListEntry(name);
}
ListEntry* next = ListEntry::firstentry;
while (next != 0)
{
next->display();
ListEntry* hold = next;
next=next->NextEntry();
delete hold;
}
return 0;
}
程序首先顯示提示信息,輸入一串姓名,以end作為結(jié)束標志。然后按照輸入順序來顯示姓名。構(gòu)造函數(shù)將表項加入鏈表,用new運算符來聲明一個表項,但并沒有把new運算符返回的地址賦值給某個指針,這是因為構(gòu)造函數(shù)會把該表項的地址賦值給前一個表項的nextentry指針。
這個程序和前面將的逆序輸出的程序都不是最佳方法,最好的方法是使用類模板,這在后面再介紹。
main()函數(shù)取得ListEntry::firstentry的值,開始遍歷鏈表,因此必需把ListEntry::firstentry設(shè)置成公有數(shù)據(jù)成員,這不符合面向?qū)ο蟪绦虻募s定,因為這里數(shù)據(jù)成員是公有的。
2.靜態(tài)成員函數(shù)
成員函數(shù)也可以是靜態(tài)的。如果一個靜態(tài)成員函數(shù)不需要訪問類的任何實例的成員,可以使用類名或者對象名來調(diào)用它。靜態(tài)成員通常用在只需要訪問靜態(tài)數(shù)據(jù)成員的情況下。
靜態(tài)成員函數(shù)沒有this指針,因為它不能訪問非靜態(tài)成員,所以它們不能把this指針指向任何東西。
下面的程序中,ListEntry類中加入了一個靜態(tài)成員函數(shù)FirstEntry(),它從數(shù)據(jù)成員firstentry獲得鏈表第一項的地址,在這兒,firstentry已經(jīng)聲明為私有數(shù)據(jù)成員了。
#include iostream.h
#include string.h
class ListEntry
{
static ListEntry* firstentry;
static ListEntry* lastentry;
char* listvalue;
ListEntry* nextentry;
public:
ListEntry(char*);
~ListEntry() { delete [] listvalue;}
static ListEntry* FirstEntry() { return firstentry; }
ListEntry* NextEntry() const { return nextentry; };
void display() const { cout< };
ListEntry* ListEntry::firstentry;
ListEntry* ListEntry::lastentry;
ListEntry::ListEntry(char* s)
{
if(firstentry==0) firstentry=this;
if(lastentry!=0) lastentry->nextentry=this;
lastentry=this;
listvalue=new char[strlen(s)+1];
strcpy(listvalue, s);
nextentry = 0;
}
int main()
{
while (1)
{
cout<<\nEnter a name ('end' when done):;
char name[25];
cin >> name;
if(strncmp(name,end,3)==0) break;
new ListEntry(name);
}
ListEntry* next = ListEntry::FirstEntry();
while (next != 0)
{
next->display();
ListEntry* hold = next;
next = next->NextEntry();
delete hold;
}
return 0;
}
函數(shù)ListEntry::FirstEntry()是靜態(tài)的,返回靜態(tài)數(shù)據(jù)成員firstentry的值。
3.公有靜態(tài)成員
如果一個靜態(tài)成員象上面程序一樣是公有的,那么在整個程序中都可以訪問它?梢栽谌魏蔚胤秸{(diào)用公有景泰成員函數(shù),而且不需要有類的實例存在。但公有靜態(tài)成員函數(shù)不完全是全局的,它不僅僅存在于定義類的作用域內(nèi)。在這個作用域里面,只要在函數(shù)名前加上類名和域解析運算符::就可以調(diào)用該函數(shù)。
相關(guān)推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |