为string类添加一个赋值运算符函数

面试中经常会被要求写一个string类,其实通过写string类就可以看出来一个人对C++的掌握能力。其实写string类主要就是看赋值运算符的重载函数的写法。在这里我自己实现了两种。如果大家有更好的办法请给我留言。

#include  <iostream>
#include <string.h>
#include <assert.h>
using namespace std;
class cstring
{
    public:
        cstring(char* data = "\0")
        {   
            m_data = new char[strlen(data)+1];
            strcpy(m_data,data);
        }   
        ~cstring()
        {   
            delete []m_data;
        }   
        cstring(const cstring &str)
        {   
            m_data = new char[strlen(str.m_data)+1];
            assert(m_data != NULL);
            strcpy(m_data,str.m_data);
        }   
//      cstring& operator=(const cstring &str) //一般方法。
//      {
//          if (this != &str)
//          {
//              delete []m_data;
//              m_data = NULL;
//              this->m_data = new char[strlen(str.m_data)+1];
//              strcpy(this->m_data,str.m_data);
//          }
//          return *this;
//      }

        cstring& operator=(const cstring &str)
        {
            if (this != &str)
            {
                cstring tmp(str);
                char* ptmp = tmp.m_data;
                tmp.m_data = m_data;
                m_data = ptmp;//交换两个对象的两个值通过析构临时对象的成员变量来析构本身的变量。
            }

            return *this;

        }

        void show()
        {
            cout<<this->m_data<<endl;
        }
    private:
        char* m_data;
};


int main()
{
    cstring str("srtff");
    cstring fg(str);
    cstring df;
    df = fg;
    str.show();
    fg.show();
    df.show();
    return 0;
}
第一种一般方法主要过程就是,首先释放掉本来的内存空间,然后为被赋值的对象重新开辟一个和赋值的对象同样大小的空间,进而将字符串拷贝进去。但是这种方法有一个缺点就是如果new失败了。而且已经将原本的内容delete掉了,所以程序面对的只能是崩溃,不是一个安全且健壮的程序所能展现的。

第二种方法是先构造了一个临时变量。然后通过临时变量来将值进行交换,且之后出了该作用域,临时变量会被析构了。不需要再为没有new成功却先delete的方面去考虑。这样的做法是即简洁又安全。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值