C++ String的传统和现代写法的深拷贝

传统写法:开辟空间并复制内容
现代写法:借助中间变量,交换指针
传统写法

#include<iostream>
using namespace std;
class String 
{
public:
//构造函数
    String(char*str="");
        :_str(new char[strlen(str)+1])
    {
        strcpy(_str, str); 
    }
//拷贝构造
    String(const String &s)//同类对象构造
    {
        :_str(new char[strlen(s._str)+1])
        strcpy(_str,s._str);
    }
//operator的重载
    String&operator(const String &s)
    {
        if(this != &s)//防止自己给自己赋值
        {
            //delete[]this->_str;//释放空间
            delete[]_str;
            _str(new char[strlen(s._str)+1])//开辟新的空间
            strcpy(_str,s._str);//赋值
        }
     return * this;
    }

~String()
{
    if(_str)
        delete[]_str;
}
char* GetStr()  
        {  
            return _str;  
        }  

    private:  
        char* _str;  

};    

现代写法

#include<iostream>
using namespace std;
class String 
{
public:
//构造函数
    String(char*str="");
        :_str(new char[strlen(str)+1])
    {
        strcpy(_str, str); 
    }
//拷贝构造,赋值运算符重载,与传统写法不同,借助中间变量,不用直接开辟空间
    String(const String &s)//同类对象构造
        :str(NULL)
    {
        String tmp(s._str);//构造函数
        swap(str,tmp._str);
    }
    String&operator=(String s)
    {
        swap(_str,s_str);
        return *this;
    }

    ~String()
    {
          delete[]_str;
    }
      char* GetStr()  
        {  
            return _str;  
        }  

    private:  
        char* _str;  

};     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值