二、構(gòu)造函數(shù)
什么是構(gòu)造函數(shù)?通俗的講,在類中,函數(shù)名和類名相同的函數(shù)稱為構(gòu)造函數(shù)。上面的Box()函數(shù)就是構(gòu)造函數(shù)。C++允許同名函數(shù),也就允許在一個類中有多個構(gòu)造函數(shù)。如果一個都沒有,編譯器將為該類產(chǎn)生一個默認(rèn)的構(gòu)造函數(shù),這個構(gòu)造函數(shù)可能會完成一些工作,也可能什么都不做。
絕對不能指定構(gòu)造函數(shù)的類型,即使是void型都不可以。實(shí)際上構(gòu)造函數(shù)默認(rèn)為void型。
當(dāng)一個類的對象進(jìn)入作用域時,系統(tǒng)會為其數(shù)據(jù)成員分配足夠的內(nèi)存,但是系統(tǒng)不一定將其初始化。和內(nèi)部數(shù)據(jù)類型對象一樣,外部對象的數(shù)據(jù)成員總是初始化為0。局部對象不會被初始化。構(gòu)造函數(shù)就是被用來進(jìn)行初始化工作的。當(dāng)自動類型的類對象離開其作用域時,所站用的內(nèi)存將釋放回系統(tǒng)。
看上面的例子,構(gòu)造函數(shù)Box()函數(shù)接受三個整型擦黑素,并把他們賦值給立方體對象的數(shù)據(jù)成員。
如果構(gòu)造函數(shù)沒有參數(shù),那么聲明對象時也不需要括號。
1.使用默認(rèn)參數(shù)的構(gòu)造函數(shù)
當(dāng)在聲明類對象時,如果沒有指定參數(shù),則使用默認(rèn)參數(shù)來初始化對象。
#include iostream.h
class Box
{
private:
int height,width,depth;
public:
Box(int ht=2,int wd=3,int dp=4)
{
height=ht;
width=wd;
depth=dp;
}
~Box();
int volume()
{
return height*width*depth;
}
};
int main()
{
Box thisbox(3,4,5); //初始化
Box defaulbox; //使用默認(rèn)參數(shù)
cout< cout<
return 0;
}
2.默認(rèn)構(gòu)造函數(shù)
沒有參數(shù)或者參數(shù)都是默認(rèn)值的構(gòu)造函數(shù)稱為默認(rèn)構(gòu)造函數(shù)。如果你不提供構(gòu)造函數(shù),編譯器會自動產(chǎn)生一個公共的默認(rèn)構(gòu)造函數(shù),這個構(gòu)造函數(shù)什么都不做。如果至少提供一個構(gòu)造函數(shù),則編譯器就不會產(chǎn)生默認(rèn)構(gòu)造函數(shù)。
3.重載構(gòu)造函數(shù)
一個類中可以有多個構(gòu)造函數(shù)。這些構(gòu)造函數(shù)必須具有不同的參數(shù)表。在一個類中需要接受不同初始化值時,就需要編寫多個構(gòu)造函數(shù),但有時候只需要一個不帶初始值的空的Box對象。
#include iostream.h
class Box
{
private:
int height,width,depth;
public:
Box() { //nothing }
Box(int ht=2,int wd=3,int dp=4)
{
height=ht;
width=wd;
depth=dp;
}
~Box();
int volume()
{
return height*width*depth;
}
};
int main()
{
Box thisbox(3,4,5); //初始化
Box otherbox;
otherbox=thisbox;
cout< return 0;
}
這兩個構(gòu)造函數(shù)一個沒有初始化值,一個有。當(dāng)沒有初始化值時,程序使用默認(rèn)值,即2,3,4。
但是這樣的程序是不好的。它允許使用初始化過的和沒有初始化過的Box對象,但它沒有考慮當(dāng)thisbox給otherbox賦值失敗后,volume()該返回什么。較好的方法是,沒有參數(shù)表的構(gòu)造函數(shù)也把默認(rèn)值賦值給對象。
class Box
{
int height,width,depth;
public:
Box()
{
height=0;width=0;depth=0;
}
Box(int ht,int wd,int dp)
{
height=ht;width=wd;depth=dp;
}
int volume()
{
return height*width*depth;
}
};
這還不是最好的方法,更好的方法是使用默認(rèn)參數(shù),根本不需要不帶參數(shù)的構(gòu)造函數(shù)。
class Box
{
int height,width,depth;
public:
Box(int ht=0,int wd=0,int dp=0)
{
height=ht;width=wd;depth=dp;
}
int volume()
{
return height*width*depth;
}
};
三、析構(gòu)函數(shù)
當(dāng)一個類的對象離開作用域時,析構(gòu)函數(shù)將被調(diào)用(系統(tǒng)自動調(diào)用)。析構(gòu)函數(shù)的名字和類名一樣,不過要在前面加上 ~ 。對一個類來說,只能允許一個析構(gòu)函數(shù),析構(gòu)函數(shù)不能有參數(shù),并且也沒有返回值。析構(gòu)函數(shù)的作用是完成一個清理工作,如釋放從堆中分配的內(nèi)存。
我們也可以只給出析構(gòu)函數(shù)的形式,而不給出起具體函數(shù)體,其效果是一樣的,如上面的例子。但在有些情況下,析構(gòu)函數(shù)又是必需的。如在類中從堆中分配了內(nèi)存,則必須在析構(gòu)函數(shù)中釋放。
相關(guān)推薦:2010年9月計算機(jī)等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |