1.传统写法:老老实实开辟空间并复制内容
2.现代写法:借助中间变量,交换指针
#include<iostream>
using namespace std;
//String类传统写法
namespace tradition
{
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);
}
//析构
~String()
{
if(_str)
delete[] _str;
}
//赋值运算符重载
String& operator=(const String& s)
{
if(this != &s) //防止自己给自己赋值
{
delete[] _str; //释放原空间
_str = new char[strlen(s._str)+1]; //开新空间
strcpy(_str, s._str); //赋值
}
return *this;
}
char* GetStr()
{
return _str;
}
private:
char* _str;
};
}
//String类现代写法
namespace modern
{
class String
{
public:
//构造,析构,打印,都和传统写法一样
String(char* str = "")
:_str(new char[strlen(str)+1])
{
strcpy(_str, str);
}
~String()
{
delete[] _str;
}
char* GetStr()
{
return _str;
}
//拷贝构造,赋值运算符重载另外写,借助中间变量,不用直接开辟空间
String(const String& s)
:_str(NULL)
{
String tmp(s._str); //构造函数
swap(_str, tmp._str);
}
String& operator=(const String& s)
{
if(this != &s)
{
String tmp(s._str);
swap(_str, tmp._str);
}
return *this;
}
private:
char* _str;
};
}