前言

在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。

位拷贝(浅拷贝)举例,a指向b,b的改变其实会影响a的改变,同时a原本指向的空间发生泄漏。

然后这种情况下有了深拷贝。

何时调用?

以下情况都会调用拷贝构造函数:
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化。

然后,我们现在从概念来理解一波

浅拷贝:位拷贝,拷贝构造函数,赋值重载

多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏。

深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符。

 class String
{ public:
const char* c_str()
{
return _str;
} String(const char* str = "")
:_str(new char[strlen(str) + ])
{
strcpy(_str, str);
}
String(const String &s)
:_str(NULL)
{
String tmp(s._str);
swap(_str, tmp._str);
}
~String()
{
if (_str)
{
delete[]_str;
}
} private:
char* _str;

通过开辟空间的方式,进行深拷贝

 String s1("字符串1");
String s2(s1);
cout << s2.c_str() << endl;

拷贝成功;

这种方式采取的  拷贝构造,注意这个

 String(const String &s)
:_str(NULL)
{
String tmp(s._str);
swap(_str, tmp._str);
}

代码解析:其中this指向拷贝的对象,s指向试图拷贝的原对象。(测试中的  this指向s2,s指向s1)

其中利用构造函数开辟空间,建立临时的tmp,然后进行交换完成拷贝。

最新文章

  1. 【Linux管理】用户管理
  2. Netty NIO 框架性能压测-短链接-对比Tomcat
  3. 1.10 基础知识——GP3.1 制度化 &amp; GP3.2 收集改进信息
  4. BZOJ 1003 物流运输 题解 【SPFA+DP】
  5. 头文件 string.h cstring string 区别
  6. hdu1827 强连通
  7. Android(java)学习笔记137:Android中SimpleAdapter,ArrayAdapter和BaseAdapter常见的适配器
  8. NIO学习:使用Channel、Buffer写入文件
  9. myeclipse中自己手动配置maven
  10. XCode工程中ARC模式与非ARC模式共用(转)
  11. 笔记:Maven 项目基本配置
  12. 收集的博客网址springboot、cloud
  13. February 12th, 2018 Week 7th Monday
  14. 分布式任务调度系统xxl-job源码探究(一、客户端)
  15. [uwsgi: command not found]
  16. C 复制字符串
  17. Minimum Palindromic Factorization(最少回文串分割)
  18. mysql 分页sql
  19. duilib入门简明教程 -- 界面设计器 DuiDesigner (10)
  20. 网站服务器压力Web性能测试(3):http_load:测试web服务器的吞吐量与负载

热门文章

  1. 上传第三方jar包到nexus
  2. 使用Connector / Python连接MySQL/查询数据
  3. GLSL 的各种着色器效果
  4. zookeeper 客户端连接报: Will not attempt to authenticate using SASL
  5. 后端开发中,可以在Cache-Control设置的常用指令
  6. 2019-04-18-NFV基础概念
  7. 利用Nginx或koa
  8. jquery关于checkbox复选框是否被选中的问题
  9. LeetCode 题解 | 1. 两数之和
  10. PyQt5之音乐播放器