欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

[c++]關(guān)于拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù)執(zhí)行次數(shù)的思考

前言

最近在學(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ù)的定義如下:

  • 簡(jiǎn)單構(gòu)造函數(shù):
Line::Line(int len){
    cout<< "Normal constructor allocating ptr." <<endl;
    // 為指針?lè)峙鋬?nèi)存
    ptr = new int;
    *ptr = len;
}
  • 拷貝構(gòu)造函數(shù):
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;
}
  • 析構(gòu)函數(shù)(在對(duì)象被銷毀時(shí)執(zhí)行):
Line::~Line(void){
    cout<< "Freeing memory!"<<endl;
    delete ptr;
}
  • 獲取Line對(duì)象的長(zhǎng)度,直接返回指針指向的int類型數(shù)據(jù)
int Line::getLength(void){
    return *ptr;
}
  • 定義一個(gè)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)原因:

  • display函數(shù)的函數(shù)參數(shù)是值傳遞,也就是說(shuō)在調(diào)用時(shí)會(huì)創(chuàng)建函數(shù)參數(shù)(Line對(duì)象)的副本,并且display函數(shù)執(zhí)行完之后,副本會(huì)被刪除。
  • 也就是說(shuō),每執(zhí)行一次display函數(shù),都會(huì)觸發(fā)對(duì)拷貝構(gòu)造函數(shù)析構(gòu)函數(shù)的調(diào)用,就會(huì)輸出如下的文本:
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
  • 而輸出結(jié)尾的兩個(gè)Freeing memory!是由于C/C++的局部變量是存儲(chǔ)在棧區(qū)stack的。棧區(qū)由編譯器自動(dòng)分配和釋放內(nèi)存。
  • 當(dāng)程序執(zhí)行到return 0;的時(shí)候,局部變量line1line2被銷毀,故析構(gòu)函數(shù)被調(diào)用。
  • 并且需要注意的是,這兩個(gè)輸出的順序是:
Freeing memory!		--> 對(duì)應(yīng)line2的銷毀
Freeing memory!		--> 對(duì)應(yīng)line1的銷毀
  • 這是因?yàn)樽兞渴谴鎯?chǔ)在棧區(qū)中的,遵循FILO(First In, Last Out)的順序。

網(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)

商城網(wǎng)站建設(shè)