2016年計算機二級C++複習資料:類對象數組和靜態成員
一、類對象數組
類的對象和C++其他數據類型一樣,也可以為其建立數組,數組的表示方法和結構一樣。
#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]lay();
dates[1]lay();
return 0;
}
1.類對象數組和默認構造函數
在前面已經説過,不帶參數或者所有參數都有默認值的構造函數叫做默認構造函數。如果類中沒有構造函數,編譯器會自動提供一個什麼都不做的公共默認構造函數 。如果類當中至少有一個構造函數,編譯器就不會提供默認構造函數。
如果類當中不含默認構造函數,則無法實例化其對象數組。因為實例花類對象數組的格式不允許用初始化值來匹配某個構造函數的參數表。
上面的程序中,main()函數聲明瞭一個長度為2的Date對象數組,還有一個包含初始化值的單個Date對象。接着把這個初始化的Date對象賦值給數組中第一個對象,然後顯示兩個數組元素中包含的日期。從輸出中可以看到,第一個日期是有效日期,而第二個顯示的都是0。
當聲明瞭某個類的對象數組時,編譯器會為每個元素都調用默認構造函數。
下面的程序去掉了構造函數的默認參數值,並且增加了一個默認構造函數。
#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]lay();
dates[1]lay();
return 0;
}
運行程序,輸出為:
Date constructor running
Date constructor running
12/31/2003
0/0/0
從輸出中可以看出,Date()這個默認構造函數被調用了兩次。
2.類對象數組和析構函數
當類對象離開作用域時,編譯器會為每個對象數組元素調用析構函數。
#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]lay();
dates[1]lay();
return 0;
}
運行程序,輸出為:
12/31/2003
0/0/0
Date destructor running
Date destructor running
Date destructor running
表明析構函數被調用了三次,也就是dates[0],dates[1],today這三個對象離開作用域時調用的。
二、靜態成員
可以把類的成員聲明為靜態的。靜態成員只能存在唯一的實例。所有的成員函數都可以訪問這個靜態成員。即使沒有聲明類的任何實例,靜態成員也已經是存在的。不過類當中聲明靜態成員時並不能自動定義這個變量,必須在類定義之外來定義該成員。
1.靜態數據成員
靜態數據成員相當於一個全局變量,類的所有實例都可以使用它。成員函數能訪問並且修改這個值。如果這個靜態成員是公有的,那麼類的作用域之內的所有代碼(不論是在類的內部還是外部)都可以訪問這個成員。下面的程序通過靜態數據成員來記錄鏈表首項和末項的地址。
#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作為結束標誌。然後按照輸入順序來顯示姓名。構造函數將表項加入鏈表,用new運算符來聲明一個表項,但並沒有把new運算符返回的地址賦值給某個指針,這是因為構造函數會把該表項的地址賦值給前一個表項的nextentry指針。
這個程序和前面將的逆序輸出的程序都不是最佳方法,最好的方法是使用類模板,這在後面再介紹。
main()函數取得ListEntry::firstentry的值,開始遍歷鏈表,因此必需把ListEntry::firstentry設置成公有數據成員,這不符合面向對象程序的.約定,因為這裏數據成員是公有的。
2.靜態成員函數
成員函數也可以是靜態的。如果一個靜態成員函數不需要訪問類的任何實例的成員,可以使用類名或者對象名來調用它。靜態成員通常用在只需要訪問靜態數據成員的情況下。
靜態成員函數沒有this指針,因為它不能訪問非靜態成員,所以它們不能把this指針指向任何東西。
下面的程序中,ListEntry類中加入了一個靜態成員函數FirstEntry(),它從數據成員firstentry獲得鏈表第一項的地址,在這兒,firstentry已經聲明為私有數據成員了。
#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;
}
函數ListEntry::FirstEntry()是靜態的,返回靜態數據成員firstentry的值。
3.公有靜態成員
如果一個靜態成員象上面程序一樣是公有的,那麼在整個程序中都可以訪問它。可以在任何地方調用公有景泰成員函數,而且不需要有類的實例存在。但公有靜態成員函數不完全是全局的,它不僅僅存在於定義類的作用域內。在這個作用域裏面,只要在函數名前加上類名和域解析運算符::就可以調用該函數。
-
2023年9月全國計算機二級C語言模擬題
2023年9月的計算機二級考試目前正在進行着考試,今天已經是考試的最後一天了,各位考生們的考試狀態如何呢?下面是小編精心整理的2023年9月全國計算機二級C語言模擬題,歡迎閲讀與收藏。9月全國計算機二級C語言模擬題1一、單項選擇題1、運算符___________的優先級最高...
-
2015下半年全國計算機二級Java考試仿真題(附答案)
一、選擇題(1)已知一棵二叉樹前序遍歷和中序遍歷分別為ABDEGCFH和DBGEACHF,則該二叉樹的後序遍歷為A)GEDHFBCAB)DGEBHFCAC)ABCDEFGHD)ACBFEDHG(2)樹是結點的集合,它的根結點數目是A)有且只有1B)1或多於1C)0或1D)至少2(3)如果進棧序列為e1,e2,e3,e4,則可能的出棧序...
-
2016年計算機二級《C語言程序設計》考試大綱
為幫助考生們更好、更有準備地參加計算機二級C語言考試,下面是本站小編搜索整理的關於二級《C語言程序設計》考試大綱,歡迎參考複習,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!全國計算機等級考試二級C語言程序設計考試大綱(2013年版...
-
2016計算機二級《MS Office》自測試題及答案
1.某二叉樹共有400個結點,其中有100個度為1的結點,則該二叉樹中的葉子結點數為A)149B)150C)151D)不存在這樣的二叉樹2.沒循環隊列的存儲空間為Q(1:35),初始狀態為front=rear=35。現經過一系列入隊與退隊運算後,front=15,rear=15,則循環隊列中的元素個數為()。A)15B)16...