前言
在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。
位拷贝(浅拷贝)举例,a指向b,b的改变其实会影响a的改变,同时a原本指向的空间发生泄漏。
然后这种情况下有了深拷贝。
何时调用?
以下情况都会调用拷贝构造函数:
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化。
然后,我们现在从概念来理解一波
浅拷贝:位拷贝,拷贝构造函数,赋值重载
多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏。
深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符。
1 class String
2 {
3
4 public:
5 const char* c_str()
6 {
7 return _str;
8 }
9
10 String(const char* str = "")
11 :_str(new char[strlen(str) + 1])
12 {
13 strcpy(_str, str);
14 }
15 String(const String &s)
16 :_str(NULL)
17 {
18 String tmp(s._str);
19 swap(_str, tmp._str);
20 }
21 ~String()
22 {
23 if (_str)
24 {
25 delete[]_str;
26 }
27 }
28
29 private:
30 char* _str;
通过开辟空间的方式,进行深拷贝
1 String s1("字符串1");
2 String s2(s1);
3 cout << s2.c_str() << endl;
拷贝成功;
这种方式采取的 拷贝构造,注意这个
1 String(const String &s)
2 :_str(NULL)
3 {
4 String tmp(s._str);
5 swap(_str, tmp._str);
6 }
代码解析:其中this指向拷贝的对象,s指向试图拷贝的原对象。(测试中的 this指向s2,s指向s1)
其中利用构造函数开辟空间,建立临时的tmp,然后进行交换完成拷贝。
原文链接: https://www.cnblogs.com/loliconinvincible/p/12556028.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/194746
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!