構造函數(shù)
什么是構造函數(shù)?通俗的講,在類中,函數(shù)名和類名相同的函數(shù)稱為構造函數(shù)。上面的Box()函數(shù)就是構造函數(shù)。C++允許同名函數(shù),也就允許在一個類中有多個構造函數(shù)。如果一個都沒有,編譯器將為該類產生一個默認的構造函數(shù),這個構造函數(shù)可能會完成一些工作,也可能什么都不做。
絕對不能指定構造函數(shù)的類型,即使是void型都不可以。實際上構造函數(shù)默認為void型。
當一個類的對象進入作用域時,系統(tǒng)會為其數(shù)據(jù)成員分配足夠的內存,但是系統(tǒng)不一定將其初始化。和內部數(shù)據(jù)類型對象一樣,外部對象的數(shù)據(jù)成員總是初始化為0。局部對象不會被初始化。構造函數(shù)就是被用來進行初始化工作的。當自動類型的類對象離開其作用域時,所站用的內存將釋放回系統(tǒng)。
看上面的例子,構造函數(shù)Box()函數(shù)接受三個整型擦黑素,并把他們賦值給立方體對象的數(shù)據(jù)成員。
如果構造函數(shù)沒有參數(shù),那么聲明對象時也不需要括號。
1.使用默認參數(shù)的構造函數(shù)
當在聲明類對象時,如果沒有指定參數(shù),則使用默認參數(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; //使用默認參數(shù)
cout< cout<
return 0;
}
2.默認構造函數(shù)
沒有參數(shù)或者參數(shù)都是默認值的構造函數(shù)稱為默認構造函數(shù)。如果你不提供構造函數(shù),編譯器會自動產生一個公共的默認構造函數(shù),這個構造函數(shù)什么都不做。如果至少提供一個構造函數(shù),則編譯器就不會產生默認構造函數(shù)。
3.重載構造函數(shù)
一個類中可以有多個構造函數(shù)。這些構造函數(shù)必須具有不同的參數(shù)表。在一個類中需要接受不同初始化值時,就需要編寫多個構造函數(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;
}
這兩個構造函數(shù)一個沒有初始化值,一個有。當沒有初始化值時,程序使用默認值,即2,3,4。
但是這樣的程序是不好的。它允許使用初始化過的和沒有初始化過的Box對象,但它沒有考慮當thisbox給otherbox賦值失敗后,volume()該返回什么。較好的方法是,沒有參數(shù)表的構造函數(shù)也把默認值賦值給對象。
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;
}
};
這還不是最好的方法,更好的方法是使用默認參數(shù),根本不需要不帶參數(shù)的構造函數(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;
}
};
析構函數(shù)
當一個類的對象離開作用域時,析構函數(shù)將被調用(系統(tǒng)自動調用)。析構函數(shù)的名字和類名一樣,不過要在前面加上 ~ 。對一個類來說,只能允許一個析構函數(shù),析構函數(shù)不能有參數(shù),并且也沒有返回值。析構函數(shù)的作用是完成一個清理工作,如釋放從堆中分配的內存。
我們也可以只給出析構函數(shù)的形式,而不給出起具體函數(shù)體,其效果是一樣的,如上面的例子。但在有些情況下,析構函數(shù)又是必需的。如在類中從堆中分配了內存,則必須在析構函數(shù)中釋放。
微信搜索"考試吧"了解更多考試資訊、下載備考資料
相關推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |