最近在學(xué)習(xí)C++的類如何構(gòu)造,在W3Cschool上看到關(guān)于拷貝構(gòu)造函數(shù)的一個(gè)例子,記錄一下。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比南州晴隆網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式南州晴隆網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南州晴隆地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。
這篇文章大致是構(gòu)造了如下的一個(gè)Line
類:
class Line{
public:
int getLength(void);
Line(int len); // 簡(jiǎn)單構(gòu)造函數(shù)
Line(const Line &obj); // 拷貝構(gòu)造函數(shù)
~Line(); // 析構(gòu)函數(shù)
private:
int *ptr; //指向length
};
其中構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義如下:
Line::Line(int len){
cout<< "Normal constructor allocating ptr." <<endl;
// 為指針?lè)峙鋬?nèi)存
ptr = new int;
*ptr = len;
}
Line::Line(const Line &obj){
cout<< "Copy constructor allocating ptr." <<endl;
ptr = new int;
// copy the value
//這里右式的運(yùn)算順序是先獲取obj.ptr,再用'*'取值.
//因?yàn)槭菑?fù)制值,而不是復(fù)制地址,所以'='兩邊都要加上'*',
//否則,多個(gè)Line對(duì)象的長(zhǎng)度都會(huì)被綁定到一起。
*ptr = *obj.ptr;
}
Line::~Line(void){
cout<< "Freeing memory!"<<endl;
delete ptr;
}
Line
對(duì)象的長(zhǎng)度,直接返回指針指向的int
類型數(shù)據(jù)int Line::getLength(void){
return *ptr;
}
display
函數(shù),用于輸出Line
對(duì)象的長(zhǎng)度:void display(Line obj){
cout<< "Length of line : "<<obj.getLength() <<endl;
}
對(duì)于以下main
函數(shù)的內(nèi)容:
int main(){
Line line1(10);
Line line2(line1); //這里調(diào)用了拷貝構(gòu)造函數(shù)
display(line1);
display(line2);
return 0;
}
預(yù)期的輸出是:
Normal constructor allocating ptr.
Copy constructor allocating ptr.
Length of line : 10
Length of line : 10
Freeing memory!
Freeing memory!
但實(shí)際輸出是:
拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù)被調(diào)用了好幾次
Normal constructor allocating ptr.
Copy constructor allocating ptr.
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!
Freeing memory!
在設(shè)置斷點(diǎn)和調(diào)試代碼之后,發(fā)現(xiàn)原因:
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!
是由于C/C++
的局部變量是存儲(chǔ)在棧區(qū)stack
的。棧區(qū)由編譯器自動(dòng)分配和釋放內(nèi)存。return 0;
的時(shí)候,局部變量line1
和line2
被銷毀,故析構(gòu)函數(shù)被調(diào)用。Freeing memory! --> 對(duì)應(yīng)line2的銷毀
Freeing memory! --> 對(duì)應(yīng)line1的銷毀
網(wǎng)頁(yè)題目:[c++]關(guān)于拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù)執(zhí)行次數(shù)的思考
文章起源:http://chinadenli.net/article8/dsoigip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、商城網(wǎng)站、靜態(tài)網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站收錄、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容