一、構(gòu)造函數(shù)和析構(gòu)函數(shù)
前面的例子已經(jīng)運(yùn)用了new和delete來為類對象分配和釋放內(nèi)存。當(dāng)使用new為類對象分配內(nèi)存時,編譯器首先用new運(yùn)算符分配內(nèi)存,然后調(diào)用類的構(gòu)造函數(shù);類似的,當(dāng)使用delete來釋放內(nèi)存時,編譯器會首先調(diào)用淚的析構(gòu)函數(shù),然后再調(diào)用delete運(yùn)算符。
#include iostream.h
class Date
{
int mo,da,yr;
public:
Date() { cout< ~Date() { cout< }
int main()
{
Date* dt = new Date;
cout< delete dt;
return 0;
}
程序定義了一個有構(gòu)造函數(shù)和析構(gòu)函數(shù)的Date類,這兩個函數(shù)在執(zhí)行時會顯示一條信息。當(dāng)new運(yùn)算符初始化指針dt時,執(zhí)行了構(gòu)造函數(shù),當(dāng)delete運(yùn)算符釋放內(nèi)存時,又執(zhí)行了析構(gòu)函數(shù)。
程序輸出如下:
Date constructor
Process the date
Date destructor
二、堆和類數(shù)組
前面提到,類對象數(shù)組的每個元素都要調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。下面的例子給出了一個錯誤的釋放類數(shù)組所占用的內(nèi)存的例子。
#include iostream.h
class Date
{
int mo, da, yr;
public:
Date() { cout< ~Date() { cout< }
int main()
{
Date* dt = new Date[5];
cout< delete dt; //這兒
return 0;
}
指針dt指向一個有五個元素的數(shù)組。按照數(shù)組的定義,編譯器會讓new運(yùn)算符調(diào)用Date類的構(gòu)造函數(shù)五次。但是delete被調(diào)用時,并沒有明確告訴編譯器指針指向的Date對象有幾個,所以編譯時,只會調(diào)用析構(gòu)函數(shù)一次。下面是程序輸出;
Date constructor
Date constructor
Date constructor
Date constructor
Date constructor
Process the date
Date destructor
為了解決這個問題,C++允許告訴delete運(yùn)算符,正在刪除的那個指針時指向數(shù)組的,程序修改如下:
#include iostream.h
class Date
{
int mo, da, yr;
public:
Date() { cout< ~Date() { cout< }
int main()
{
Date* dt = new Date[5];
cout< delete [] dt; //這兒
return 0;
}
最終輸出為:
Date constructor
Date constructor
Date constructor
Date constructor
Date constructor
Process the date
Date destructor
Date destructor
Date destructor
Date destructor
Date destructor
相關(guān)推薦:2010年9月計(jì)算機(jī)等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |