劍指offer:面試題一:賦值運算符函數


class CMyString
{
      public:
             CMyString(char *pData = NULL);
             CMyString(const CMyString& str);
             ~CMyString(void);
             CMyString& operator = (const CMyString& str);
      //private:
              char* m_pData;
} ;

CMyString::CMyString(char *pData)
{
    if(pData == NULL)  
    {  
        m_pData = new char[1];  
        m_pData[0] = '\0';  
    }  
    else  
    {  
        m_pData = new char[strlen(pData)+1]; 
        strcpy(m_pData,pData);  
    }  
}

CMyString::CMyString(const CMyString& mstr)
{
                         
      this -> m_pData = new char[strlen(mstr.m_pData) + 1];
      strcpy(m_pData,mstr.m_pData);
}
CMyString::~CMyString(void) 
{
       delete []m_pData;
}

/*
//初級版本 
CMyString& CMyString::operator = (const CMyString& str)
{
      if(this == &str)
      {
              return *this;
      }
      delete []m_pData; //釋放掉原有內存 
      m_pData = NULL;
      m_pData = new char[strlen(str.m_pData) + 1];
      strcpy(m_pData,str.m_pData);
      return (*this); 
       
}

*/
//無敵改進版 
CMyString& CMyString::operator = (const CMyString& mstr)
{
      if(this == &mstr)
      {
              return *this;
      }
      CMyString tempString(mstr);
      char *temp = tempString.m_pData;
      tempString.m_pData = this -> m_pData;
      this -> m_pData = temp;
      return *this;
}
測試程序:
int main()
{
    char *str = "hello";
    CMyString s1(str);
    CMyString s2;
    s2 = s1;
    cout << s2.m_pData << endl; 
}



運行結果:

另外需要注意的是,剛剛在使用構造函數的缺省參數時,是這樣定義的:

<span style="font-size:18px;">class CMyString
{
      public:
             CMyString(char *pData = NULL);
             CMyString(const CMyString& str);
             ~CMyString(void);
             CMyString& operator = (const CMyString& str);
      //private:
              char* m_pData;
} ;</span>

然後在定義構造函數時,按照如下定義方式:

<span style="font-size:18px;">CMyString::CMyString(char *pData = NULL)
{
    if(pData == NULL)  
    {  
        m_pData = new char[1];  
        m_pData[0] = '\0';  
    }  
    else  
    {  
        m_pData = new char[strlen(pData)+1]; 
        strcpy(m_pData,pData);  
    }  
}</span>

結果程序報錯了!

在網上查找資料後,發現:

既可以在類的聲明中,或者也可以在函數定義中聲明缺省參數。但是,不能既在類聲明中又在函數定義中同時聲明缺省參數。如果兩者都聲明的話,就像我上面一樣,編譯器是無法正確編譯的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章