C++ - 賦值運(yùn)算符重載

  • 賦值運(yùn)算符兩邊的類型可以不匹配
    • 把一個(gè) int 類型變量賦值給一個(gè) Complex對(duì)象
    • 把一個(gè) char* 類型的字符串賦值給一個(gè)字符串對(duì)象
  • 需要重載賦值運(yùn)算符 ‘=’
  • 賦值運(yùn)算符“=”只能重載為成員函數(shù)
  • 編寫一個(gè)長度可變的字符串類 String
    • 包含一個(gè) char*類型的成員變量
      ->指向動(dòng)態(tài)分配的存儲(chǔ)空間
    • 該存儲(chǔ)空間用于存放‘\0’結(jié)尾的字符串
class String{
      private:
          char *str;
    public:
          String():str(NULL){}//構(gòu)造函數(shù)
          const char * c_str() {return str; }//返回值,因?yàn)椴幌M饨缒軌蛐薷乃祷刂羔標(biāo)赶虻膬?nèi)容,所以這里返回 const 指針
          char * operator = (const char * s);
          ~String();
}
//重載'='->obj = "hello"能夠成立
char *String :: operator = (const char * s){
    if(str)delete[]str;//如果指針之前有指向的內(nèi)容,則刪除
    if(s){
        str = new char[strlen(s)+1];//因?yàn)橐砑幽┪驳?\0',所以要+1
        strcpy(str,s);
    }
    else
        str = NULL;
    return str;
}
String::~String(){
    if(str) delete []str;
};
int main(){
      String s;
      s = "Good Luck,"; //-->s.operator = ("")
      cout<<s.c_str()<<endl;
      s = "shenzhou 8";
      cout<<s.c_str()<<endl;
      return 0;
}
  • 重載賦值運(yùn)算符的意義 - 淺復(fù)制深復(fù)制
MyString S1,S2;
S1 = "this";
S2 = "that";
S1 = S2;
- 淺拷貝:那么 S1中指向 “this” 的指針會(huì)改變?yōu)橹赶?"that"的內(nèi)存空間的指針,也就是對(duì) S2 中指向 "that" 內(nèi)存空間的指針進(jìn)行了拷貝。這樣會(huì)到來兩個(gè)問題:
    * 之前 “this” 內(nèi)容變?yōu)槔鴥?nèi)存
    * 當(dāng) S1 和 S2 要釋放的時(shí)候,會(huì)對(duì) “that” 空間連續(xù)釋放兩次,造成程序崩潰。
- 深拷貝:將 “that” 內(nèi)容拷貝給 “this” 內(nèi)容的空間,這樣就不會(huì)出現(xiàn)淺拷貝所出現(xiàn)的問題。
  • 在 class MyString 里添加成員函數(shù):
//實(shí)現(xiàn)深復(fù)制
String & operator = (const String & s){
    if(str == s.str)return * this;//如果傳遞進(jìn)來的指針和我的指針是一樣的話,那么就返回當(dāng)前的指針。例如:s = s
    if(str) delete [] str;
    str = new char[strlen(s.str)+1];
    strcpy(str,s.str);
    return * this;
}
  • 對(duì) operatpr = 返回值類型的討論
    • void:
      • 如果使用 a = b = c 的話會(huì)造成第二個(gè)式子參數(shù)為0.
    • String好不好?為什么是 String&
      運(yùn)算符重載的時(shí)候,盡量保留運(yùn)算符原本的特性,
      考慮:
(a=b)=c;//會(huì)修改 a 的值
等價(jià)于:  
  (a.operator =(b)).operator=(c);
  • 為String 類編寫復(fù)制構(gòu)造函數(shù)時(shí)
  • 會(huì)面臨和 ‘=’ 同樣的問題,用同樣的方法處理
//如果使用默認(rèn)的復(fù)制構(gòu)造函數(shù)的時(shí),那么會(huì)出現(xiàn)上面一樣的重復(fù)釋放的問題
String::String(String & s)
{
    if(s.str){
          str = new char[strlen(s.str)+1];
          strcpy(str,s.str);
     }else{
          str = NULL;
      }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容