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

时间:2023-01-05 19:50:03

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

#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;

};