構(gòu)造函數(shù)
介紹
類的構(gòu)造函數(shù)是一個特殊的函數(shù)蛆封,在創(chuàng)建對象時調(diào)用剃法;不返回任何數(shù)據(jù)類型碎捺,類似于初始化函數(shù),可以在其中初始化一些成員變量;
格式
構(gòu)造函數(shù)的函數(shù)名和類名完全一致;
在需要初始化一些成員時收厨,會需要傳遞參數(shù)晋柱,構(gòu)造函數(shù)允許其帶參數(shù)選項;
classname();//構(gòu)造函數(shù)
classname( type parameter);//帶參構(gòu)造函數(shù)
使用初始化列表初始化字段
Line::Line( double len): length(len)
{
cout << "Object is being created, length = " << len << endl;
}
上面的語法等同于如下語法:
Line::Line( double len)
{
length = len;
cout << "Object is being created, length = " << len << endl;
}
假設(shè)有一個類 C诵叁,具有多個字段 X雁竞、Y、Z 等需要進行初始化拧额,同理地碑诉,您可以使用上面的語法,只需要在不同的字段使用逗號進行分隔侥锦,如下所示:
C::C( double a, double b, double c): X(a), Y(b), Z(c)
{
....
}
初始化列表就類似于另一種格式的进栽、不寫在函數(shù)體內(nèi)的對類內(nèi)成員的初始化方式;
析構(gòu)函數(shù)
介紹
析構(gòu)函數(shù)是一個特殊的函數(shù)恭垦,與構(gòu)造函數(shù)類似快毛,但它在對象刪除時才被調(diào)用
格式
它只是在構(gòu)造函數(shù)的格式的基礎(chǔ)上,前部加上波浪線 ~番挺,但它不能有返回值與參數(shù)唠帝,一般用于釋放一些資源;
~classname();
拷貝構(gòu)造函數(shù)
介紹
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)玄柏,它在創(chuàng)建對象時襟衰,是使用同一類中之前創(chuàng)建的對象來初始化新創(chuàng)建的對象〗拷貝構(gòu)造函數(shù)通常用于:
通過使用另一個同類型的對象來初始化新創(chuàng)建的對象右蒲。
復(fù)制對象把它作為參數(shù)傳遞給函數(shù)阀湿。
復(fù)制對象赶熟,并從函數(shù)返回這個對象。
如果在類中沒有定義拷貝構(gòu)造函數(shù)陷嘴,編譯器會自行定義一個映砖。如果類帶有指針變量,并有動態(tài)內(nèi)存分配灾挨,則它必須有一個拷貝構(gòu)造函數(shù)邑退;
格式
classname (const classname &obj) {
// 構(gòu)造函數(shù)的主體
}
在這里,obj 是一個對象引用劳澄,該對象是用于初始化另一個對象的地技。
實例
- 類內(nèi)帶有指針的情況,必須自己定義一個拷貝構(gòu)造函數(shù)來為指針分配資源秒拔;
#include <iostream>
using namespace std;
class Line
{
public:
int getLength( void );
Line( int len ); // 簡單的構(gòu)造函數(shù)
Line( const Line &obj); // 拷貝構(gòu)造函數(shù)
~Line(); // 析構(gòu)函數(shù)
private:
int *ptr;
};
// 成員函數(shù)定義莫矗,包括構(gòu)造函數(shù)
Line::Line(int len)
{
cout << "調(diào)用構(gòu)造函數(shù)" << endl;
// 為指針分配內(nèi)存
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj)
{
cout << "調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存" << endl;
ptr = new int;
*ptr = *obj.ptr; // 拷貝值
}
Line::~Line(void)//自己補充完善函數(shù)體
{
cout << "釋放內(nèi)存" << endl;
delete ptr;
}
int Line::getLength( void )
{
return *ptr;
}
void display(Line obj)
{
cout << "line 大小 : " << obj.getLength() <<endl;
}
// 程序的主函數(shù)
int main( )
{
Line line(10);
display(line);
return 0;
}
當(dāng)上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:
調(diào)用構(gòu)造函數(shù)
調(diào)用拷貝構(gòu)造函數(shù)并為指針 ptr 分配內(nèi)存
line 大小 : 10
釋放內(nèi)存
釋放內(nèi)存