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

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| 免费欧美在线| 欧美v亚洲v综合ⅴ国产v| 噜噜噜久久亚洲精品国产品小说| 久久精品盗摄| 欧美国产日本| 亚洲伦伦在线| 亚洲制服欧美中文字幕中文字幕| 亚洲天堂黄色| 欧美在线观看视频一区二区| 久久成人这里只有精品| 欧美本精品男人aⅴ天堂| 欧美日韩一区二区免费在线观看| 久久国产视频网| 蜜臀av性久久久久蜜臀aⅴ| 欧美成人一区在线| 亚洲美女黄色片| 亚洲综合不卡| 久久看片网站| 欧美色欧美亚洲高清在线视频| 国产精品视频999| 尤物视频一区二区| 亚洲天堂av在线免费观看| 久久久久久成人| 亚洲精品中文字| 久久精品国产91精品亚洲| 美女主播视频一区| 国产精品久久久久久影视| 在线观看一区| 午夜精品免费视频| 亚洲国内精品| 久久不射电影网| 欧美视频官网| 亚洲精品欧美专区| 久久久成人网| 亚洲一品av免费观看| 免费在线播放第一区高清av| 国产精品青草综合久久久久99 | 欧美在线视屏| 欧美性做爰毛片| 91久久极品少妇xxxxⅹ软件| 欧美亚洲一区二区三区| 日韩一级不卡| 欧美丰满少妇xxxbbb| 国产色综合网| 亚洲综合色婷婷| 亚洲伦伦在线| 欧美精品久久久久久| 久久久久久久久岛国免费| 午夜久久久久久| 久久综合久久88| 在线视频欧美日韩精品| 免费国产自线拍一欧美视频| 国产日韩久久| 亚洲综合精品四区| 亚洲国产精品999| 欧美一区免费| 国产精品自在线| 亚洲专区在线| 一区二区三区日韩| 欧美日韩一区二| 亚洲亚洲精品在线观看| 国产精品久久久久永久免费观看| 亚洲精品免费网站| 欧美激情一区三区| 免费亚洲一区| 日韩一级黄色大片| 亚洲精品在线电影| 欧美日本中文字幕| 亚洲综合色视频| 午夜久久一区| 在线精品亚洲| 亚洲第一天堂无码专区| 欧美高清在线一区| 1204国产成人精品视频| 亚洲韩国一区二区三区| 欧美日本二区| 亚洲欧美视频一区| 欧美亚洲视频| 在线日韩视频| 亚洲精品国产精品国自产在线| 欧美精品粉嫩高潮一区二区| 亚洲最新在线视频| 午夜久久影院| 亚洲高清av| 夜夜嗨av色一区二区不卡| 国产欧美精品一区二区三区介绍| 先锋影音久久久| 久久精品视频在线看| 亚洲毛片播放| 亚洲欧美日韩中文视频| 永久免费精品影视网站| 亚洲人成网站精品片在线观看 | 久久婷婷蜜乳一本欲蜜臀| 亚洲国产综合在线| 亚洲四色影视在线观看| 伊甸园精品99久久久久久| 91久久中文字幕| 国产精品欧美一区二区三区奶水| 久久国产精彩视频| 欧美精品三级在线观看| 欧美一级黄色网| 欧美好骚综合网| 久久九九热re6这里有精品| 久久不射中文字幕| 亚洲图片欧美一区| 国产一区 二区 三区一级| 亚洲高清视频一区| 国产精品国码视频| 女同一区二区| 国产精品自在欧美一区| 亚洲国产欧美日韩| 狠狠色综合网站久久久久久久| 亚洲国产毛片完整版| 国产色爱av资源综合区| 亚洲伦理网站| 亚洲国产成人久久综合一区| 亚洲午夜极品| 亚洲婷婷综合久久一本伊一区| 久久久噜噜噜久久中文字免| 午夜在线观看免费一区| 欧美色精品天天在线观看视频| 另类图片综合电影| 韩日视频一区| 久久成人精品一区二区三区| 亚洲欧美日韩一区在线| 欧美日本精品一区二区三区| 久久这里只精品最新地址| 国产女主播在线一区二区| 一本久久综合亚洲鲁鲁| 99亚洲视频| 欧美日韩岛国| 亚洲精品在线观看免费| 99日韩精品| 欧美日韩国产bt| 亚洲精品社区| 精久久久久久| 快射av在线播放一区| 欧美国产视频一区二区| 亚洲国产欧美国产综合一区| 久久久久久久久岛国免费| 美腿丝袜亚洲色图| 在线成人性视频| 久久久久久9999| 免费一级欧美片在线观看| 亚洲高清资源综合久久精品| 麻豆国产精品一区二区三区 | 欧美性色aⅴ视频一区日韩精品| 亚洲片区在线| 亚洲一区二区黄| 国产精品mm| 亚洲欧美大片| 美女福利精品视频| 亚洲免费观看高清完整版在线观看熊 | 欧美日本在线播放| 日韩一区二区福利| 亚洲欧美日韩国产一区二区| 国产精品久久久久av| 亚洲欧美日韩另类| 美女啪啪无遮挡免费久久网站| 亚洲国产一区二区三区在线播 | 久久亚洲精品网站| 亚洲天堂男人| 亚洲一区精品视频| 久久国产精品久久精品国产| 黑人一区二区三区四区五区| 久久人人爽人人爽爽久久| 亚洲成色777777女色窝| 99精品免费| 国产欧美精品一区| 女同性一区二区三区人了人一| 亚洲精品视频中文字幕| 欧美中文字幕精品| 亚洲人成免费| 国产一区三区三区| 欧美日韩国产精品自在自线| 亚洲免费视频成人| 亚洲大黄网站| 欧美中文字幕第一页| 日韩视频欧美视频| 国产在线欧美| 国产精品h在线观看| 久久在线精品| 亚洲欧美制服中文字幕| 亚洲精品欧美极品| 麻豆久久精品| 欧美一区二粉嫩精品国产一线天| 亚洲国产精品激情在线观看| 国产精品一区二区久久久久| 欧美激情亚洲激情| 久久九九久精品国产免费直播| 亚洲毛片在线看| 欧美激情成人在线视频| 久久久99久久精品女同性| 亚洲香蕉在线观看| 亚洲精选一区二区| 亚洲第一主播视频| 国内精品视频久久| 国产亚洲欧美日韩日本|