一、構(gòu)造函數(shù)和析構(gòu)函數(shù)
前面的例子已經(jīng)運(yùn)用了new和delete來(lái)為類(lèi)對(duì)象分配和釋放內(nèi)存。當(dāng)使用new為類(lèi)對(duì)象分配內(nèi)存時(shí),編譯器首先用new運(yùn)算符分配內(nèi)存,然后調(diào)用類(lèi)的構(gòu)造函數(shù);類(lèi)似的,當(dāng)使用delete來(lái)釋放內(nèi)存時(shí),編譯器會(huì)首先調(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è)有構(gòu)造函數(shù)和析構(gòu)函數(shù)的Date類(lèi),這兩個(gè)函數(shù)在執(zhí)行時(shí)會(huì)顯示一條信息。當(dāng)new運(yùn)算符初始化指針dt時(shí),執(zhí)行了構(gòu)造函數(shù),當(dāng)delete運(yùn)算符釋放內(nèi)存時(shí),又執(zhí)行了析構(gòu)函數(shù)。
程序輸出如下:
Date constructor
Process the date
Date destructor
二、堆和類(lèi)數(shù)組
前面提到,類(lèi)對(duì)象數(shù)組的每個(gè)元素都要調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。下面的例子給出了一個(gè)錯(cuò)誤的釋放類(lèi)數(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指向一個(gè)有五個(gè)元素的數(shù)組。按照數(shù)組的定義,編譯器會(huì)讓new運(yùn)算符調(diào)用Date類(lèi)的構(gòu)造函數(shù)五次。但是delete被調(diào)用時(shí),并沒(méi)有明確告訴編譯器指針指向的Date對(duì)象有幾個(gè),所以編譯時(shí),只會(huì)調(diào)用析構(gòu)函數(shù)一次。下面是程序輸出;
Date constructor
Date constructor
Date constructor
Date constructor
Date constructor
Process the date
Date destructor
為了解決這個(gè)問(wèn)題,C++允許告訴delete運(yùn)算符,正在刪除的那個(gè)指針時(shí)指向數(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ī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |