點(diǎn)擊查看:2015年國(guó)家計(jì)算機(jī)二級(jí)C 考試復(fù)習(xí)資料匯總
二級(jí)C++輔導(dǎo)筆記:類對(duì)象數(shù)組和靜態(tài)成員
一、類對(duì)象數(shù)組
類的對(duì)象和C++其他數(shù)據(jù)類型一樣,也可以為其建立數(shù)組,數(shù)組的表示方法和結(jié)構(gòu)一樣。
#include iostream.h
class Date
{
int mo,da,yr;
public:
Date(int m=0,int d=0, int y=0) { mo=m; da=d; yr=y;}
void display() const { cout < };
int main()
{
Date dates[2];
Date today(12,31,2003);
dates[0]=today;
dates[0].display();
dates[1].display();
return 0;
}
1.類對(duì)象數(shù)組和默認(rèn)構(gòu)造函數(shù)
在前面已經(jīng)說過,不帶參數(shù)或者所有參數(shù)都有默認(rèn)值的構(gòu)造函數(shù)叫做默認(rèn)構(gòu)造函數(shù)。如果類中沒有構(gòu)造函數(shù),編譯器會(huì)自動(dòng)提供一個(gè)什么都不做的公共默認(rèn)構(gòu)造函數(shù) 。如果類當(dāng)中至少有一個(gè)構(gòu)造函數(shù),編譯器就不會(huì)提供默認(rèn)構(gòu)造函數(shù)。
如果類當(dāng)中不含默認(rèn)構(gòu)造函數(shù),則無法實(shí)例化其對(duì)象數(shù)組。因?yàn)閷?shí)例花類對(duì)象數(shù)組的格式不允許用初始化值來匹配某個(gè)構(gòu)造函數(shù)的參數(shù)表。
上面的程序中,main()函數(shù)聲明了一個(gè)長(zhǎng)度為2的Date對(duì)象數(shù)組,還有一個(gè)包含初始化值的單個(gè)Date對(duì)象。接著把這個(gè)初始化的Date對(duì)象賦值給數(shù)組中第一個(gè)對(duì)象,然后顯示兩個(gè)數(shù)組元素中包含的日期。從輸出中可以看到,第一個(gè)日期是有效日期,而第二個(gè)顯示的都是0。
當(dāng)聲明了某個(gè)類的對(duì)象數(shù)組時(shí),編譯器會(huì)為每個(gè)元素都調(diào)用默認(rèn)構(gòu)造函數(shù)。
下面的程序去掉了構(gòu)造函數(shù)的默認(rèn)參數(shù)值,并且增加了一個(gè)默認(rèn)構(gòu)造函數(shù)。
#include
class Date
{
int mo, da, yr;
public:
Date();
Date(int m,int d,int y) { mo=m; da=d; yr=y;}
void display() const { cout < };
Date::Date()
{
cout < mo=0; da=0; yr=0;
}
int main()
{
Date dates[2];
Date today(12,31,2003);
dates[0]=today;
dates[0].display();
dates[1].display();
return 0;
}
運(yùn)行程序,輸出為:
Date constructor running
Date constructor running
12/31/2003
0/0/0
從輸出中可以看出,Date()這個(gè)默認(rèn)構(gòu)造函數(shù)被調(diào)用了兩次。
2.類對(duì)象數(shù)組和析構(gòu)函數(shù)
當(dāng)類對(duì)象離開作用域時(shí),編譯器會(huì)為每個(gè)對(duì)象數(shù)組元素調(diào)用析構(gòu)函數(shù)。
#include iostream.h
class Date
{
int mo,da,yr;
public:
Date(int m=0,int d=0,int y=0) { mo=m; da=d; yr=y;}
~Date() {cout < void display() const {cout< };
int main()
{
Date dates[2];
Date today(12,31,2003);
dates[0]=today;
dates[0].display();
dates[1].display();
return 0;
}
運(yùn)行程序,輸出為:
12/31/2003
0/0/0
Date destructor running
Date destructor running
Date destructor running
表明析構(gòu)函數(shù)被調(diào)用了三次,也就是dates[0],dates[1],today這三個(gè)對(duì)象離開作用域時(shí)調(diào)用的。
二、靜態(tài)成員
可以把類的成員聲明為靜態(tài)的。靜態(tài)成員只能存在唯一的實(shí)例。所有的成員函數(shù)都可以訪問這個(gè)靜態(tài)成員。即使沒有聲明類的任何實(shí)例,靜態(tài)成員也已經(jīng)是存在的。不過類當(dāng)中聲明靜態(tài)成員時(shí)并不能自動(dòng)定義這個(gè)變量,必須在類定義之外來定義該成員。
1.靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員相當(dāng)于一個(gè)全局變量,類的所有實(shí)例都可以使用它。成員函數(shù)能訪問并且修改這個(gè)值。如果這個(gè)靜態(tài)成員是公有的,那么類的作用域之內(nèi)的所有代碼(不論是在類的內(nèi)部還是外部)都可以訪問這個(gè)成員。下面的程序通過靜態(tài)數(shù)據(jù)成員來記錄鏈表首項(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)志。然后按照輸入順序來顯示姓名。構(gòu)造函數(shù)將表項(xiàng)加入鏈表,用new運(yùn)算符來聲明一個(gè)表項(xiàng),但并沒有把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ù)不需要訪問類的任何實(shí)例的成員,可以使用類名或者對(duì)象名來調(diào)用它。靜態(tài)成員通常用在只需要訪問靜態(tài)數(shù)據(jù)成員的情況下。
靜態(tài)成員函數(shù)沒有this指針,因?yàn)樗荒茉L問非靜態(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è)程序中都可以訪問它?梢栽谌魏蔚胤秸{(diào)用公有景泰成員函數(shù),而且不需要有類的實(shí)例存在。但公有靜態(tài)成員函數(shù)不完全是全局的,它不僅僅存在于定義類的作用域內(nèi)。在這個(gè)作用域里面,只要在函數(shù)名前加上類名和域解析運(yùn)算符::就可以調(diào)用該函數(shù)。
相關(guān)推薦:
各地2015年計(jì)算機(jī)等級(jí)考試報(bào)名時(shí)間匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |