• <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>
            posts - 183,  comments - 10,  trackbacks - 0
            賦值運(yùn)算符的重載,有不同的方法,Effective C++ 中有一個(gè)條款對此介紹。
             1 #include <iostream>
             2 using namespace std;
             3 
             4 class MyString
             5 {
             6 private:
             7     unsigned len;
             8     char* data;
             9 public:
            10     MyString(const char* s = "");
            11     MyString(const MyString& s);
            12     MyString& operator = (const MyString& s);
            13     ~MyString();
            14 };
            15 
            16 MyString::MyString(const char* s)
            17 {
            18     len = strlen(s);
            19     data = new char[len + 1];
            20     if (data != 0)
            21     {
            22         strcpy(data, s);
            23     }
            24 }
            25 
            26 MyString::MyString(const MyString& s)
            27 {
            28     len = s.len;
            29     data = new char[len + 1];
            30     if (data != 0)
            31     {
            32         strcpy(data, s.data);
            33     }
            34 }
            35 
            36 MyString& MyString:: operator = (const MyString& s)
            37 {
            38     // 第一種方法,需要檢測自賦值,因?yàn)槿绻粰z測,則會(huì)造成當(dāng)自賦值時(shí),就直接將該對象的 data delete 了,也就是 s.data 被 delete 了。這時(shí) s.data 是個(gè)懸置指針,所致內(nèi)存極可能無效
            39     //
            40     //if (this != &s)
            41     //{
            42     //    delete [] data;
            43     //    len = s.len;
            44     //    data = new char[len + 1];
            45     //    if (data != 0)
            46     //    {
            47     //        strcpy(data, s.data);
            48     //    }
            49     //}
            50     //return *this;
            51     
            52     // 另一種方法, 不需要檢測自賦值
            53     // 這種方式需要做一個(gè)備份,自賦值情況下,temp 保持了另一份備份,即便 delete 了 data 還是留有一份
            54     // 非自賦值的情況下,對 s.data 所指的內(nèi)容有了一個(gè)備份,然后 delete data,將 temp 賦予 data,這樣有了兩份 s.data,到達(dá)賦值的目的
            55     len = s.len;
            56     char* temp = new char[len + 1];
            57     if (temp != 0)
            58     {
            59         strcpy(temp, s.data);
            60     }
            61     delete [] data;
            62     data = temp;
            63     return *this;
            64 
            65     // 兩種方法的代價(jià)分析
            66     // 第一種方法,需要每次都要檢測是不是自賦值了,對于自賦值的情況,雖然檢測了,但是避免了備份,有利于自賦值的情況。但是對于非自賦值的情況,都需要額外的檢測,這種檢測是浪費(fèi)的
            67     // 第二種方法,不管是自賦值還是非自賦值都需要備份,這種方法對于自賦值的情況,較第一種方法代價(jià)高些,但是對于非自賦值的情況它不需要檢測,也是做一個(gè) copy 所以非自賦值的情況效率由于第一種方法
            68     // 也就是說第一種方法對于自賦值的情況好,第二種方法對于非自賦值的情況好。一般情況下,自賦值的情況并不經(jīng)常出現(xiàn),所以第一種檢測自賦值的操作很多情況下是多余的,所以相對第一種方法,第二種方法更好些。
            69 }
            70 
            71 MyString::~MyString()
            72 {
            73     len = 0;
            74     delete [] data;
            75 }
            76 
            77 int main()
            78 {
            79     MyString a("C++ Programming"), c("Hello");
            80     MyString b(a);
            81     c = b;
            82     cout << ". . ." << endl;
            83     return 0;
            84 }


            posted on 2011-06-16 10:56 unixfy 閱讀(244) 評(píng)論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产成人精品综合久久久久 | 久久无码AV中文出轨人妻| 99久久99久久精品国产片果冻| 伊人久久综在合线亚洲2019| 久久人人超碰精品CAOPOREN| 国产69精品久久久久APP下载| 麻豆AV一区二区三区久久| 999久久久国产精品| 日韩欧美亚洲综合久久| 亚洲成色999久久网站| 久久久精品国产| 中文字幕一区二区三区久久网站| 欧美亚洲国产精品久久| 一本大道加勒比久久综合| 91麻豆国产精品91久久久| 精品久久人人爽天天玩人人妻| 精品伊人久久久| 久久国产精品波多野结衣AV| 久久精品国产亚洲av水果派| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 天天爽天天狠久久久综合麻豆| 丰满少妇高潮惨叫久久久| 久久久亚洲AV波多野结衣| 欧美精品一本久久男人的天堂| 色88久久久久高潮综合影院| 思思久久99热只有频精品66| 99久久国产综合精品五月天喷水| 亚洲AV无码久久精品蜜桃| 久久婷婷人人澡人人爽人人爱| 久久久无码精品午夜| 99热都是精品久久久久久| 97久久超碰国产精品2021| 久久成人国产精品| 2021精品国产综合久久| 久久精品这里热有精品| 色综合久久天天综合| 中文字幕一区二区三区久久网站| 久久国产精品成人免费| 狠狠久久综合| 模特私拍国产精品久久| 亚洲精品高清国产一线久久|