2026/7/22 15:47:43
网站建设
项目流程
拷贝这个词对于我们来说应该不陌生,比如我们平常的复制和粘贴就是拷贝;但是如果把拷贝这个词放到C++中来说就有一些复杂了,我们先来看一下什么是浅拷贝:
下面用字符串类来模拟实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | classAstring
{
public:
//构造函数
Astring(constchar* str ="")
{
_str =newchar[strlen(str) + 1];
strcpy(_str, str);
}
//采用浅拷贝写的构造函数
Astring(constAstring& s)
{
_str = s._str;
}
//析构函数
~Astring()
{
delete[] _str;
_str = nullptr;
}
private:
char* _str;
};
intmain()
{
Astring aa("hello C++");
Astring bb(aa);//这里调用拷贝构造
return0;
}
|
当我们执行以上程序的话就会失败,结果如下:
![]()
分析如下图所示:
![]()
所以我们采用浅拷贝使用同一块空间是不行了,那么怎么办呢?当然是重新开一块和别人同样大小的空间,然后再把别人空间里面的内容给拷贝过来,而这样就是所谓的深拷贝了;我们还是用字符串类来模拟实现深拷贝:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | classAstring
{
public:
//构造函数
Astring(constchar* str ="")
{
_str =newchar[strlen(str) + 1];
strcpy(_str, str);
}
//采用深拷贝写的构造函数
Astring(constAstring& s)
{
_str =newchar[strlen(s._str) + 1];
strcpy(_str, s._str);
}
//析构函数
~Astring()
{
delete[] _str;
_str = nullptr;
}
private:
char* _str;
};
intmain()
{
Astring aa("hello C++");
Astring bb(aa);
return0;
}
|
分析如下图所示:
![]()
二、string类的两种写法
有了上面我们知道的深浅拷贝,所以我们明白类中的拷贝构造函数和赋值重载一定要用深拷贝来实现,不过拷贝构造函数和赋值重载还是有两种写法的。
1. 传统写法
传统写法就是要自己开辟空间自己来拷贝别人的东西,什么事情都要自己干,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //搞一个命名空间,里面实现自己写的string类
namespacecjy
{
classstring
{
public:
//构造函数
string(constchar* str ="")
:_str(newchar[strlen(str) + 1])
{
strcpy(_str, str);
}
//拷贝构造函数
string(string& s)
:_str(newchar[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
//赋值重载,s1=s3
string& operator=(conststring& s)
{
if(this!= &s)
{
char* tmp =newchar[strlen(s._str) + 1];
delete[] _str;
_str = tmp;
strcpy(_str, s._str);
}
return*this;
}
//析构函数
~string()
{
delete[] _str;
_str = nullptr;
}
private:
char* _str;
};
}
|
2. 现代写法
现代写法就是复用其它的函数,自己不用干活,交给其它函数来帮你实现,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //现代写法:拷贝构造、赋值重载函数
namespacecjy
{
classstring
{
public:
//构造函数
string(constchar* str ="")
{
_str =newchar[strlen(str) + 1];
strcpy(_str, str);
}
//拷贝构造函数
string(conststring& s)
:_str(nullptr)
{
string tmp(s._str);
std::swap(_str, tmp._str);
}
//赋值重载
string& operator=(string s)
{
std::swap(_str, s._str);
return*this;
}
private:
char* _str;
};
}
|
分析如下图所示:
![]()
![]()
总结
本篇文章就到这里了,希望能够给你带来帮助,