全國統(tǒng)一學(xué)習(xí)專線 8:30-21:00

課程導(dǎo)航
更多

位置:用考培訓(xùn)網(wǎng) > 計算機類>計算機等級> 全國計算機二級C++知識點:類對象數(shù)組和靜態(tài)成員

全國計算機二級C++知識點:類對象數(shù)組和靜態(tài)成員

logo
來源:233網(wǎng)校

2018-10-31 11:29:39

進入 >

類對象數(shù)組和靜態(tài)成員

一、類對象數(shù)組

類的對象和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.類對象數(shù)組和默認構(gòu)造函數(shù)

在前面已經(jīng)說過,不帶參數(shù)或者所有參數(shù)都有默認值的構(gòu)造函數(shù)叫做默認構(gòu)造函數(shù)。如果類中沒有構(gòu)造函數(shù),編譯器會自動提供一個什么都不做的公共默認構(gòu)造函數(shù) 。如果類當(dāng)中至少有一個構(gòu)造函數(shù),編譯器就不會提供默認構(gòu)造函數(shù)。

如果類當(dāng)中不含默認構(gòu)造函數(shù),則無法實例化其對象數(shù)組。因為實例花類對象數(shù)組的格式不允許用初始化值來匹配某個構(gòu)造函數(shù)的參數(shù)表。

上面的程序中,main()函數(shù)聲明了一個長度為2的Date對象數(shù)組,還有一個包含初始化值的單個Date對象。接著把這個初始化的Date對象賦值給數(shù)組中第一個對象,然后顯示兩個數(shù)組元素中包含的日期。從輸出中可以看到,第一個日期是有效日期,而第二個顯示的都是0。

當(dāng)聲明了某個類的對象數(shù)組時,編譯器會為每個元素都調(diào)用默認構(gòu)造函數(shù)。

下面的程序去掉了構(gòu)造函數(shù)的默認參數(shù)值,并且增加了一個默認構(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;

}

運行程序,輸出為:

Date constructor running

Date constructor running

12/31/2003

0/0/0

從輸出中可以看出,Date()這個默認構(gòu)造函數(shù)被調(diào)用了兩次。

2.類對象數(shù)組和析構(gòu)函數(shù)

當(dāng)類對象離開作用域時,編譯器會為每個對象數(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;

}

運行程序,輸出為:

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這三個對象離開作用域時調(diào)用的。

二、靜態(tài)成員

可以把類的成員聲明為靜態(tài)的。靜態(tài)成員只能存在唯一的實例。所有的成員函數(shù)都可以訪問這個靜態(tài)成員。即使沒有聲明類的任何實例,靜態(tài)成員也已經(jīng)是存在的。不過類當(dāng)中聲明靜態(tài)成員時并不能自動定義這個變量,必須在類定義之外來定義該成員。

1.靜態(tài)數(shù)據(jù)成員

靜態(tài)數(shù)據(jù)成員相當(dāng)于一個全局變量,類的所有實例都可以使用它。成員函數(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ù)。

以上就是小編為您整理全國計算機二級C++知識點:類對象數(shù)組和靜態(tài)成員的全部內(nèi)容,更多精彩請進入計算機等級欄目查看

  • 推薦課程
  • 相關(guān)學(xué)校
  • 相關(guān)文章
預(yù)約免費試聽

只要一個電話
我們免費為您回電