• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            liyuxia713

            蹣跚前行者

            常用鏈接

            統(tǒng)計

            Algorithms

            C++

            最新評論

            指針學習1--new &delete & destructor

            1. 一般指針的new&delete

            對于指針a,delete a之后,指針a 的地址仍然是原來的地址(并不是NULL),只不過所指向的對象被釋放了,此時指針存放的值為隨機的,由編譯器確定。

             1     int *= new int(2);
             2     cout << "after new :" << endl;
             3     cout << "a = " << a << "," << "*a = " << *<< endl;
             4
             5     delete a;
             6     cout << "after delete: " << endl;
             7     if(a == NULL)
             8     {
             9         cout << "a is null after delete" << endl;
            10     }

            11     else
            12     {
            13         cout << " a is not null after delete" << endl;
            14     }

            15     cout << "a = " << a << "," << "*a = " << *<< endl; 
            //好的編程習慣
            delete a;
            = NULL;

            常規(guī)方法創(chuàng)建的對象,當實際對象(而不是對象的引用)超出作用域時,才會運行析構函數(shù)
            動態(tài)方法創(chuàng)建的對象,當刪除指向動態(tài)分配對象的指針時,才會運行析構函數(shù)。         


            2. 一般類對象的聲明與初始化:不用new也可以定義類對象(區(qū)別于java),默認調析構函數(shù)
            注:為方便簡單演示,并沒有遵循三法則

             1class Stu
             2{
             3   public:
             4         Stu(int m):var(m)
             5          
             6                  var = m;
             7                  cout << "constructor called." << endl;
             8          }
                  
             9          ~Stu() { cout << var << " destructor called." << endl;}         
            10   private:
            11          int var;         
            12}
            ;
            13
            14void func()
            15{
            16       //調用構造函數(shù)
            17       Stu a(20);
            18       //調用默認復制構造函數(shù)
            19       Stu b(a);     
            20       //等價于Stu temp(b); Stu b(temp);  
            21       //所以有調用構造函數(shù)的過程
            22       Stu c = 30;     
            23       //都是用隱式方式定義的,所以不用delete,自動調用析構函數(shù)
            24 |        //注意析構的順序     
            25}

            26
            27int main()
            28{
            29   func();   
            30   return 0;
            31}

            這里有一個需要注意的地方,就是如果func里面的代碼是直接寫在main里的則不一定調用析構函數(shù) ,由編譯器決定。
            上面是dev c++, 下面是vc6.0的運行結果
             1
             2int main()
             3{
             4
             5    //{
             6       //調用構造函數(shù)
             7       Stu a(20);
             8       //調用默認復制構造函數(shù)
             9       Stu b(a);     
            10       //等價于Stu temp(b); Stu b(temp);  
            11       //所以有調用構造函數(shù)的過程
            12       Stu c = 30;     
            13       //new出來的指針對象,必須顯示delete,如a,b
            14       //類對象結束局部范圍后會自動調用析構函數(shù) 如c    
            15    //}
            16    return 0;
            17}


            3. 用new定義類對象,必須delete
            動態(tài)分配的對象只有在指向該對象的指針被刪除時才撤銷。如果沒有刪除指向動態(tài)對象的指針,則不會運行該對象的析構函數(shù),對象則一直存在,從而導致內存泄露。
            常規(guī)方法創(chuàng)建的對象,當實際對象(而不是對象的引用)超出作用域時,才會運行析構函數(shù)
            動態(tài)方法創(chuàng)建的對象,當刪除指向動態(tài)分配對象的指針時,才會運行析構函數(shù)。
             1class Stu
             2{
             3   public:
             4         Stu(int m):var(m)
             5          
             6                  var = m;
             7                  cout << "constructor called." << endl;
             8          }
                  
             9          ~Stu() { cout << var << " destructor called." << endl;}         
            10   private:
            11          int var;         
            12}
            ;
            13
            14void func()
            15{
            16       //調用構造函數(shù)
            17       Stu* a = new Stu(20);
            18       //調用默認復制構造函數(shù)
            19       Stu* b= new Stu(*a);     
            20       //等價于Stu temp = new Stu(30); Stu b(temp);  
            21       //所以有調用構造函數(shù)的過程
            22       Stu c = 30;     
            23       //new出來的指針對象,必須顯示delete,如a,b
            24       //類對象結束局部范圍后會自動調用析構函數(shù) 如c
            25       delete a;
            26       delete b;
            27}

            28
            29int main()
            30{
            31   func();   
            32   return 0;
            33}

            posted on 2010-04-18 10:58 幸運草 閱讀(782) 評論(0)  編輯 收藏 引用 所屬分類: C++

            久久精品天天中文字幕人妻 | 久久精品99久久香蕉国产色戒| 精品久久久久久国产| A级毛片无码久久精品免费| 国产精品免费久久久久久久久 | 国产V综合V亚洲欧美久久| 99久久久精品| 久久天天躁狠狠躁夜夜av浪潮| 囯产极品美女高潮无套久久久 | 色综合久久88色综合天天| 欧美国产精品久久高清| 久久综合狠狠综合久久| 国产成人精品久久一区二区三区av | 亚洲国产成人久久精品影视| 四虎亚洲国产成人久久精品| 99久久超碰中文字幕伊人| 欧美成人免费观看久久| 美女写真久久影院| 久久久久久精品成人免费图片| 久久av高潮av无码av喷吹| 亚洲精品乱码久久久久久蜜桃图片| 久久―日本道色综合久久| 久久午夜无码鲁丝片| 一本大道久久香蕉成人网| 亚洲伊人久久大香线蕉苏妲己| 波多野结衣久久一区二区| 久久精品中文字幕第23页| 久久国产精品成人片免费| 欧美日韩精品久久久免费观看| 久久精品国产72国产精福利| 97久久综合精品久久久综合| 午夜不卡久久精品无码免费| 女同久久| 亚洲人成电影网站久久| 久久99热这里只有精品国产| 91精品国产高清久久久久久国产嫩草 | 99久久精品免费观看国产| 国产午夜久久影院| 国产亚洲精久久久久久无码| 青草国产精品久久久久久 | 国产精品免费看久久久|