<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [c++]關于拷貝構造函數和析構函數執行次數的思考

      前言

      最近在學習C++的類如何構造,在W3Cschool上看到關于拷貝構造函數的一個例子,記錄一下。

      案例背景

      這篇文章大致是構造了如下的一個Line類:

      class Line{
          public:
              int getLength(void);
              Line(int len);          // 簡單構造函數
              Line(const Line &obj);  // 拷貝構造函數
              ~Line();                // 析構函數
      
          private:
              int *ptr;   //指向length
      };
      

      其中構造函數和析構函數的定義如下:

      • 簡單構造函數:
      Line::Line(int len){
          cout<< "Normal constructor allocating ptr." <<endl;
          // 為指針分配內存
          ptr = new int;
          *ptr = len;
      }
      
      • 拷貝構造函數:
      Line::Line(const Line &obj){
          cout<< "Copy constructor allocating ptr." <<endl;
          ptr = new int;
          // copy the value
          //這里右式的運算順序是先獲取obj.ptr,再用'*'取值.
          //因為是復制值,而不是復制地址,所以'='兩邊都要加上'*',
          //否則,多個Line對象的長度都會被綁定到一起。
          *ptr = *obj.ptr;
      }
      
      • 析構函數(在對象被銷毀時執行):
      Line::~Line(void){
          cout<< "Freeing memory!"<<endl;
          delete ptr;
      }
      
      • 獲取Line對象的長度,直接返回指針指向的int類型數據
      int Line::getLength(void){
          return *ptr;
      }
      
      • 定義一個display函數,用于輸出Line對象的長度:
      void display(Line obj){
          cout<< "Length of line : "<<obj.getLength() <<endl;
      }
      

      正文

      對于以下main函數的內容:

      int main(){
          Line line1(10);
          Line line2(line1);  //這里調用了拷貝構造函數
      
          display(line1);
          display(line2);
      
          return 0;
      }
      

      預期的輸出是:

      Normal constructor allocating ptr.
      Copy constructor allocating ptr.
      Length of line : 10
      Length of line : 10
      Freeing memory!
      Freeing memory!
      

      但實際輸出是:
      拷貝構造函數析構函數被調用了好幾次

      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!
      

      分析

      在設置斷點和調試代碼之后,發現原因:

      • display函數的函數參數是值傳遞,也就是說在調用時會創建函數參數(Line對象)的副本,并且display函數執行完之后,副本會被刪除。
      • 也就是說,每執行一次display函數,都會觸發對拷貝構造函數析構函數的調用,就會輸出如下的文本:
      Copy constructor allocating ptr.
      Length of line : 10
      Freeing memory!
      
      • 而輸出結尾的兩個Freeing memory!是由于C/C++的局部變量是存儲在棧區stack的。棧區由編譯器自動分配和釋放內存。
      • 當程序執行到return 0;的時候,局部變量line1line2被銷毀,故析構函數被調用。
      • 并且需要注意的是,這兩個輸出的順序是:
      Freeing memory!		--> 對應line2的銷毀
      Freeing memory!		--> 對應line1的銷毀
      
      • 這是因為變量是存儲在棧區中的,遵循FILO(First In, Last Out)的順序。
      posted @ 2022-08-05 15:55  feixianxing  閱讀(299)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产va免费精品观看| 中文字幕日韩有码第一页| 四虎影视4hu4虎成人| 亚欧洲乱码视频一二三区| 欧美高清精品一区二区| 少妇性bbb搡bbb爽爽爽欧美| 国产精品一品二区三区日韩| 国产精品视频午夜福利| 岛国中文字幕一区二区| 黄色国产精品一区二区三区| 亚洲激情在线一区二区三区| 极品少妇被后入内射视| 久久精品国产99国产精品严洲| 国产国拍精品av在线观看| 少妇人妻真实偷人精品| 美女内射毛片在线看免费人动物| 国产极品美女高潮抽搐免费网站 | 凯里市| 2020国产成人精品视频| 色一伦一情一区二区三区| 无码伊人久久大杳蕉中文无码| 亚洲欧美日韩成人综合一区| 久久九九久精品国产免费直播| 在线中文字幕第一页| 亚洲国产天堂久久综合226114| 中文字幕人妻无码一区二区三区| 国产一级毛片高清完整视频版| 国产精品一码在线播放| 国产一区二区三区四区色| 忍着娇喘人妻被中出中文字幕| 四虎永久在线精品无码视频| 蜜臀91精品国产高清在线| 九九热爱视频精品| 亚洲综合一区二区精品导航| 日韩激情一区二区三区| 根河市| 亚洲精品麻豆一二三区| 亚洲高清 一区二区三区| 精品无码成人片一区二区| 久久99日韩国产精品久久99| 露脸一二三区国语对白|