版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
实现String的构造函数、拷贝构造函数、赋值运算符的重载、析构函数
-
class String
-
{
-
private:
-
char* data;
-
public:
-
String();
-
String(
const
char* pstr);
-
String(
const String& str);
-
String&
operator=(
const String& str);
-
virtual ~String();
-
};
-
-
//默认构造函数,要初始化一个空的字符串
-
String::String()
-
{
-
data =
new
char[
1];
-
data[
0] =
'\0';
-
}
-
//C字符串的有参构造函数
-
String::String(
const
char* pstr)
-
{
-
data =
new
char[
strlen(pstr) +
1];
-
strcpy(data, pstr);
-
}
-
//拷贝构造函数,需要深拷贝
-
String::String(
const String& str)
-
{
-
data =
new
char[
strlen(str.data) +
1];
-
strcpy(data, str.data);
-
}
-
//赋值运算符重载,也要深拷贝
-
//并且注意返回值是引用,要防止自赋值,参数传const引用
-
String& String::
operator=(
const String& str)
-
{
-
if (
this != &str)
-
{
-
char* tmp =
new
char[
strlen(str.data) +
1];
-
strcpy(tmp, str.data);
-
-
delete[] data;
-
data = tmp;
-
}
-
return *
this;
-
}
-
String:: ~String()
-
{
-
if (data !=
nullptr)
-
{
-
delete[] data;
-
data =
nullptr;
-
}
-
}
-
-
//另外,关于拷贝构造函数、赋值运算符重载函数的深拷贝,还有另外一种写法,
-
//通过复用构造函数偷梁换柱。
-
//拷贝构造函数,需要深拷贝
-
String::String(
const String& str)
-
{
-
data =
nullptr;
-
String tmp(str.data);
-
swap(data, tmp.data);
-
}
-
//赋值运算符重载,也要深拷贝
-
//并且注意返回值是引用,要防止自赋值,参数传const引用
-
String& String::
operator=(
const String& str)
-
{
-
if (
this != &str)
-
{
-
String tmp(str.data);
-
swap(data, tmp.data);
-
}
-
return *
this;
-
}