剑指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>

结果程序报错了!

在网上查找资料后,发现:

既可以在类的声明中,或者也可以在函数定义中声明缺省参数。但是,不能既在类声明中又在函数定义中同时声明缺省参数。如果两者都声明的话,就像我上面一样,编译器是无法正确编译的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值