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