深拷贝:指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
传统写法
namespace sxl
{
//管理字符串的顺序表,可以增删查改
//字符串结尾有\0
class string
{
public:
//构造函数
//若str=nullptr,strlen会崩,会认为
string(const char* str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
拷贝构造函数
//传统写法
//s2(s1)
string(const string& s)
:_str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
//s1 = s3
//防止s1 = s1 即自己给自己赋值
string& operator=(const string& s)
{
if (this != &s)
{
delete[] _str; 、、
_str = new char[strlen(s._str) + 1];
strcpy(_str, s._str);
}
return *this;
}
~string()
{
delete[] _str;
_str = nullptr;
}
const char* c_str()
{
return _str;
}
private:
char* _str;
};
void test_string1()
{
string s1("hello world");
string s2(s1);
cout << s1.c_str() << endl;
cout << s2.c_str() << endl;
string s3("hello sxl");
s1 = s3;
cout << s1.c_str() << endl;
cout << s3.c_str() << endl;
}
}
现代写法
namespace sxl
{
//管理字符串的顺序表,可以增删查改
//字符串结尾有\0
class string
{
public:
构造函数
string(const char* str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
// 拷贝构造函数
//现代写法
//s2(s1) 拷贝构造
string(const string& s)
:_str(nullptr)
{
string tmp(s._str);
swap(_str, tmp._str);
}
// s1 = s3 赋值重载
string operator=(string s)
{
swap(_str, s._str);
return *this;
}
~string()
{
delete[] _str;
_str = nullptr;
}
const char* c_str()
{
return _str;
}
private:
char* _str;
};
void test_string1()
{
string s1("hello world");
string s2(s1);
cout << s1.c_str() << endl;
cout << s2.c_str() << endl;
string s3("hello sxl");
s1 = s3;
cout << s1.c_str() << endl;
cout << s3.c_str() << endl;
}
}
应用:写一个简洁版的string
就是考察的四个默认成员函数,深浅拷贝问题,传统与现代两种写法均可以