青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 183,  comments - 10,  trackbacks - 0

swap 到底做了什么
swap 交換兩個內置數據類型的變量時,直接交換。
swap 交換自定義類型對象時,如果里面沒有成員指針,直接交換各個對應成員。
如果自定義類型中有指針成員,則是交換兩個指針的值,但是指針的指向的值得不到交換。
正是由于這個原因,可以用 swap 進行重載 operator = 時避免自賦值情況,而是生產一個臨時對象,然后與本對象 swap 即可。

關于重載 operator = 自賦值的情況,更詳細內容可以查看《Effective C++》
實驗程序:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 class Str
  5 {
  6 private:
  7     char* s_;
  8 public:
  9     Str(const char* s = "")
 10     {
 11         s_ = new char[strlen(s) + 1];
 12         if (s_ == 0)
 13         {
 14             cout << "test" << endl;
 15             exit(1);
 16         }
 17         strcpy(s_, s);
 18     }
 19     // 定義拷貝構造函數,這里會被用于 operator =,swap
 20     Str(const Str& rhs)
 21     {
 22         s_ = new char[strlen(rhs.s_) + 1];
 23         if (s_ == 0)
 24         {
 25             cout << "test" << endl;
 26             exit(1);
 27         }
 28         strcpy(s_, rhs.s_);
 29     }
 30     ~Str()
 31     {
 32         clear();
 33     }
 34     //// 常規的 operator = 重載實現方式,必須檢查自賦值
 35     //// 因為如果不自賦值檢驗,對于自賦值現象如果不調用 clear,則 s_ 在 new 之后就改變,rhs 也改變,原來的丟失,后來的也不是合法內容
 36     //// 如果調用 clear,不會內存泄露,但是 rhs 的內容被釋放掉,rhs 的內容也不是合法內容。
 37     //// 如果檢驗自賦值,而沒有 clear,原來 *this 的那塊內存會被丟失,造成內存泄露。
 38     //Str& operator = (const Str& rhs)
 39     //{
 40     //    if (this != &rhs)
 41     //    {
 42     //        clear();
 43     //        s_ = new char[strlen(rhs.s_) + 1];
 44     //        if (s_ == 0)
 45     //        {
 46     //            exit(1);
 47     //        }
 48     //        strcpy(s_, rhs.s_);
 49     //    }
 50     //    return *this;
 51     //}
 52 
 53     // 改進的 operator,先用一個 temp 保持 rhs,然后 swap
 54     // 這種方式不怕自賦值,因為如果是自賦值,也有一個備份 temp,操作值相同的兩個對象 *this 和 temp,直接交換不會影響結果
 55     // 如果不是自賦值,不是交換 *this 和 rhs,而是交換 *this 和 rhs 的一個復制品 temp,最終 *this 得到的值就是 rhs 的一個副本,完成賦值
 56     // 這種方式不用檢驗自賦值,所以可以省去每次調用時的自賦值檢驗,在基本上不會遇到自賦值檢驗的情況下,這種方法可以省去很多誤用的檢驗
 57     // 但是它會每次生成一個副本,這樣做的效率與原來的非自賦值一樣,而且還需要一個 swap,但是這種方式是異常安全的,用對象來管理資源,資源分配即初始化
 58     Str& operator = (const Str& rhs)
 59     {
 60         cout << "test" << endl;
 61         Str temp(rhs);
 62         // swap(*this, temp);
 63         // 這里會引起遞歸調用,因為 operator = 調用 swap,swap 內部又調用 operator = ,一直遞歸下去,直到棧溢出
 64         swap(s_, temp.s_);
 65         // Effective C++ 中提到,可以定義一個成員函數 swap,用于交換兩個對象對應的數據成員。這樣可以防止無限遞歸。
 66         // 另一種好的方式是除定義一個成員函數 swap 外,傳參類型為 值類型 T,這樣就可以直接交換返回。
 67         // 這些方法的前提都是要有定義拷貝構造函數的。
 68         return *this;
 69     }
 70 
 71     void clear()
 72     {
 73         delete [] s_;
 74     }
 75     void foo()
 76     {
 77         cout << s_ << endl;
 78     }
 79 };
 80 
 81 int main()
 82 {
 83     int a = 3, b = 5;
 84     swap(a, b);
 85     cout << a << endl;
 86     cout << b << endl;
 87 
 88     Str s1("abc");
 89     Str s2("xyz");
 90     s1.foo();
 91     s2.foo();
 92 
 93     swap(s1, s2);
 94     // 這里輸出兩個 test,我們得知,有兩個賦值操作
 95     // 可以推測 swap 的內部實現是 T t(s2), s2 = s1, s1 = t;
 96     s1.foo();
 97     s2.foo();
 98 
 99     s2 = s1;
100     s1.foo();
101     s2.foo();
102 
103     return 0;
104 }


posted on 2011-05-27 22:14 unixfy 閱讀(903) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            又紧又大又爽精品一区二区| 国产精品日韩欧美大师| 91久久久久久| 欧美成人精品在线播放| 亚洲免费观看| 亚洲人成亚洲人成在线观看| 国产精品99久久不卡二区| 国产亚洲一区二区三区| 欧美午夜欧美| 欧美日韩视频在线一区二区| 欧美亚洲在线| 亚洲欧美日韩综合国产aⅴ| 欧美一区二区三区在线视频 | 欧美日韩亚洲一区二区三区四区| 日韩午夜一区| 一区二区三区**美女毛片| 日韩小视频在线观看| 一本色道久久加勒比精品| 亚洲视频在线观看视频| 一区二区三区 在线观看视| 一区二区三区 在线观看视频| 99热在线精品观看| 国产欧美日韩中文字幕在线| 国产精品亚洲美女av网站| 国产欧美精品久久| 国语精品中文字幕| 亚洲国产精品悠悠久久琪琪| 欧美在线精品一区| 久久激情中文| 欧美国产欧美亚洲国产日韩mv天天看完整 | 怡红院精品视频在线观看极品| 国产区欧美区日韩区| 伊人狠狠色j香婷婷综合| 亚洲一区二区三区乱码aⅴ蜜桃女| 午夜精品久久| 亚洲国产欧美一区二区三区同亚洲| 亚洲第一福利在线观看| 亚洲欧美精品在线观看| 久久久蜜桃精品| 国产欧美va欧美不卡在线| 99v久久综合狠狠综合久久| 久久久99久久精品女同性| 亚洲精品1234| 久久精品国产一区二区三| 国产精品swag| 亚洲一区二区在线视频| 欧美高清在线一区二区| 久久久久久久999| 国产自产在线视频一区| 久久成人综合网| 欧美一区二区成人6969| 国产精品一区二区三区乱码| 亚洲一区二区三区久久| 亚洲视频在线一区| 欧美性猛片xxxx免费看久爱| 亚洲调教视频在线观看| 国产亚洲欧洲997久久综合| 亚洲一区综合| 亚洲综合二区| 91久久极品少妇xxxxⅹ软件| 亚洲国产日韩一区| 国产精品剧情在线亚洲| 亚洲欧美成人在线| 欧美怡红院视频| 亚洲人成网站777色婷婷| 亚洲国产欧美一区二区三区久久| 欧美国产日韩精品| 欧美在线|欧美| 欧美成年人在线观看| 日韩网站在线| 久久久国产91| 欧美在线网站| 免费不卡亚洲欧美| 亚洲视频专区在线| 久久国产视频网站| 亚洲视频免费看| 久久精品日产第一区二区三区| 亚洲国产91色在线| 午夜精品偷拍| 亚洲一区亚洲二区| 欧美国产精品劲爆| 欧美在线观看一区| 国产精品青草久久| 亚洲精选一区| av成人免费在线| 欧美电影免费观看高清完整版| 亚洲国产aⅴ天堂久久| 久久蜜桃精品| av成人免费| 久久在线视频在线| 9i看片成人免费高清| 欧美三级在线视频| 亚洲欧洲日产国产综合网| 亚洲香蕉伊综合在人在线视看| 亚洲精品欧美在线| 欧美性猛交xxxx乱大交蜜桃| 亚洲巨乳在线| 久久影院午夜片一区| 亚洲黑丝一区二区| 欧美网站大全在线观看| 久久国产福利| 这里只有精品电影| 欧美激情国产精品| 欧美一区二区三区成人| 亚洲欧洲另类国产综合| 国产精品你懂的在线| 免播放器亚洲一区| 亚洲欧美日韩国产中文| 亚洲国产日本| 亚洲成色777777女色窝| 久久久久久网站| 亚洲男人av电影| 久久se精品一区二区| 亚洲精品乱码久久久久久蜜桃91 | 亚洲国产成人tv| 亚洲二区在线视频| 91久久精品一区二区三区| 亚洲国产一区二区三区青草影视| 久久夜色精品亚洲噜噜国产mv| 欧美亚洲视频一区二区| 久久精品99无色码中文字幕| 欧美黄色片免费观看| 午夜视频在线观看一区二区三区 | 欧美成黄导航| 亚洲一区二区三区国产| 久久精品国产清自在天天线| 欧美一级二级三级蜜桃| 欧美在线免费| 日韩视频在线观看国产| 亚洲黄网站黄| 亚洲综合国产精品| 亚洲午夜精品视频| 久久国产精品第一页| 国内揄拍国内精品少妇国语| 国产精品久久久久久久浪潮网站| 国产视频不卡| 亚洲一区亚洲| 久久久国产精品亚洲一区| 欧美日韩一级黄| 欧美高清不卡| 亚洲欧美日韩国产一区二区| 一区二区精品国产| 免费中文字幕日韩欧美| 一区二区三区精品| 久久影视精品| 国产精品久久久久国产a级| 欧美激情日韩| 红桃视频欧美| 久久理论片午夜琪琪电影网| 午夜视频在线观看一区| 国产欧美亚洲一区| 免费观看不卡av| 亚洲黄色av| 欧美华人在线视频| 亚洲激情在线观看| 亚洲人线精品午夜| 欧美aⅴ99久久黑人专区| 欧美大片一区二区三区| 精品成人一区二区三区四区| 欧美一级片久久久久久久| 亚洲成人中文| 欧美亚洲日本国产| 国产色产综合产在线视频| 亚洲三级影院| 精品动漫一区二区| 欧美gay视频激情| 亚洲国产毛片完整版| 国产亚洲欧洲| 久久精品国产一区二区三区免费看| 久久久在线视频| 一区二区精品在线观看| 国产欧美日韩一区二区三区在线观看| 性高湖久久久久久久久| 亚洲激情在线观看| 香蕉成人久久| 一本久久综合亚洲鲁鲁| 国产亚洲欧美激情| 欧美超级免费视 在线| 亚洲欧美色婷婷| 一本久久a久久精品亚洲| 国内免费精品永久在线视频| 欧美日韩在线播| 欧美在线播放一区二区| 亚洲人成网站999久久久综合| 亚洲一区二区成人在线观看| 国语自产在线不卡| 猫咪成人在线观看| 欧美—级高清免费播放| 亚洲精品美女在线观看| 久久久亚洲国产天美传媒修理工 | 一区二区欧美日韩| 国产精品卡一卡二| 欧美激情 亚洲a∨综合| 亚洲午夜视频| 亚洲精品乱码久久久久久| 久久久久久久久久久久久9999| 在线视频一区观看| 亚洲日本黄色| 国产欧美精品日韩精品| 国产精品成人免费精品自在线观看|