二、靜態(tài)成員
可以把類的成員聲明為靜態(tài)的。靜態(tài)成員只能存在唯一的實(shí)例。所有的成員函數(shù)都可以訪問(wèn)這個(gè)靜態(tài)成員。即使沒(méi)有聲明類的任何實(shí)例,靜態(tài)成員也已經(jīng)是存在的。不過(guò)類當(dāng)中聲明靜態(tài)成員時(shí)并不能自動(dòng)定義這個(gè)變量,必須在類定義之外來(lái)定義該成員。
1.靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員相當(dāng)于一個(gè)全局變量,類的所有實(shí)例都可以使用它。成員函數(shù)能訪問(wèn)并且修改這個(gè)值。如果這個(gè)靜態(tài)成員是公有的,那么類的作用域之內(nèi)的所有代碼(不論是在類的內(nèi)部還是外部)都可以訪問(wèn)這個(gè)成員。下面的程序通過(guò)靜態(tài)數(shù)據(jù)成員來(lái)記錄鏈表首項(xiàng)和末項(xiàng)的地址。
#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é)束標(biāo)志。然后按照輸入順序來(lái)顯示姓名。構(gòu)造函數(shù)將表項(xiàng)加入鏈表,用new運(yùn)算符來(lái)聲明一個(gè)表項(xiàng),但并沒(méi)有把new運(yùn)算符返回的地址賦值給某個(gè)指針,這是因?yàn)闃?gòu)造函數(shù)會(huì)把該表項(xiàng)的地址賦值給前一個(gè)表項(xiàng)的nextentry指針。
這個(gè)程序和前面將的逆序輸出的程序都不是最佳方法,最好的方法是使用類模板,這在后面再介紹。
main()函數(shù)取得ListEntry::firstentry的值,開始遍歷鏈表,因此必需把ListEntry::firstentry設(shè)置成公有數(shù)據(jù)成員,這不符合面向?qū)ο蟪绦虻募s定,因?yàn)檫@里數(shù)據(jù)成員是公有的。
2.靜態(tài)成員函數(shù)
成員函數(shù)也可以是靜態(tài)的。如果一個(gè)靜態(tài)成員函數(shù)不需要訪問(wèn)類的任何實(shí)例的成員,可以使用類名或者對(duì)象名來(lái)調(diào)用它。靜態(tài)成員通常用在只需要訪問(wèn)靜態(tài)數(shù)據(jù)成員的情況下。
靜態(tài)成員函數(shù)沒(méi)有this指針,因?yàn)樗荒茉L問(wèn)非靜態(tài)成員,所以它們不能把this指針指向任何東西。
下面的程序中,ListEntry類中加入了一個(gè)靜態(tài)成員函數(shù)FirstEntry(),它從數(shù)據(jù)成員firstentry獲得鏈表第一項(xiàng)的地址,在這兒,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)成員
如果一個(gè)靜態(tài)成員象上面程序一樣是公有的,那么在整個(gè)程序中都可以訪問(wèn)它。可以在任何地方調(diào)用公有景泰成員函數(shù),而且不需要有類的實(shí)例存在。但公有靜態(tài)成員函數(shù)不完全是全局的,它不僅僅存在于定義類的作用域內(nèi)。在這個(gè)作用域里面,只要在函數(shù)名前加上類名和域解析運(yùn)算符::就可以調(diào)用該函數(shù)。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |