c++,operator=


operator=為什么值得注意?

從語法上講,下面的程序可以編譯通過,我在另一篇筆記示例里面也這樣用了。

class A1
{
public:
    int operator=(int a)//參數是int,語法通過但邏輯不通。
    {
        return 8;
    }

    int operator+(int a)
    {
        return 9;
    }

    int operator=(A1 &a)//返回int,既無意義也不合邏輯,
    {
        cout<<"operator=(A1 &a)"<<endl;
        return 0;
    }
};  
// http://www.cnblogs.com/mylinux/p/4094808.html

 

實際上如圖拷貝構造函數一樣,我們要考慮更多問題:

1.淺拷貝的問題。[1]//構造函數,operator=與構造函數的道理相同。

注意事項:[2]  //Effective_C++

2.為什么opreator=要返回*this?
  為了支持a=b=c這樣的連鎖調用
3.為什么不返回const GoodObject&?
  為了和編譯器(a=b)=c這樣的操作兼容
4.為什么要傳入const GoodObject& rhs
  主要支持以下操作:
  GoodObject a;
  const GoodObject b;
  a = b;
5.為什么要有if (this != &rhs)這樣的判斷
  主要是避免自我賦值a=a這樣的情況發生.
6.不要忘記重寫拷貝構造函數

 

7.示例:[3]

參考網友的示例:

class SampleClass
{
private:
         int a;
         double b;
         float* p;
public:
         SampleClass& operator= (const SampleClass& s)
         {
                   if(this == &s) return *this; // 解決自我賦值的一句話
                   a = s.a;
                   b = s.b;
                   delete p;
                   p = new float(*s.p);
                   return *this;
         }
};

 書上是這樣寫的://雖然多了個tmp,但建議參考

SampleClass& operator= (const SampleClass& s)
{
         if(this == &s) return *this; //
         a = s.a;
         b = s.b;
         float* tmp = p; // 先保存了舊的指針
         p = new float(*s.p); // 再申請新的空間,如果申請失敗,p仍然指向原有的地址空間
         delete tmp; // 能走到這里,說明申請空間是成功的,這時可以刪掉舊的內容了
         return *this;
}

 

參考:

1.C++深淺拷貝淺析
  http://www.jizhuomi.com/software/291.html

2.operator=函數.

  http://blog.csdn.net/howlet2/article/details/5090756

3.讀書筆記_Effective_C++_條款十一:在operator=中處理自我賦值
  http://www.cnblogs.com/jerry19880126/archive/2013/03/21/2972648.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM