这个题目是参考别人面经的一道题,顺着这个问题研究了一下拷贝构造函数。拷贝构造函数简单点理解就是通过一个已有的对象去构造一个新的对象。

class Foo {public:Foo();               //默认构造函数Foo(const Foo&);    //拷贝构造函数
}

拷贝构造函数的第一个参数必须是引用类型,一般情况下我们在拷贝构造函数也不会尝试改变传进来的参数,所以加const。参数不能是值传递,具体原因可以看看【C++】类的拷贝构造函数参数为什么一定要是引用类型?

拷贝构造函数的作用和用途?

拷贝构造函数一般用于以下三种情况:
1.当用类的一个对象去初始化该类的另外一个对象时。
2.如果函数的形参是类的对象,调用函数时,是值传递。(引用传递并不调用拷贝构造函数)
3.如果函数的返回值是类的对象,函数执行完成时会返回调用者时。

深拷贝和浅拷贝的理解

对于普通成员,浅拷贝和深拷贝并没有区别。主要区别在于对于指针的拷贝。假设有一个A对象存在一个a指针,指向D内存。用A对象去初始化一个新的对象B,如果是浅拷贝,那么只会拷贝指针b=a,它们都指向D内存区域。如果是深拷贝,不仅拷贝指针b=a,还会申请一块新的内存空间E,原来的a指向D,新的b指向E。

什么时候需要自定义拷贝构造函数?

前面提到浅拷贝和深拷贝的区别在于会不会复制新的内存空间(前提是类中存在指针类成员变量)。如果是浅拷贝的状态下,析构A对象,必然会释放D内存;析构B对象时,指针b同样指向D内存,此时D内存早已经被释放了。就出现了同一内存空间被释放两次的情况,系统就会报错。

类定义时,如果没有显式定义拷贝构造函数,就会调用默认拷贝构造函数,对应的是浅拷贝。正确的方法是定义一个显示的拷贝构造函数实现深拷贝。

总结:当类存在指针类成员变量时,默认拷贝构造函数是浅拷贝,会导致二次析构问题,所以要自定义拷贝构造函数。

《C++ Primer中文版》

【C++】对拷贝构造函数 深浅拷贝 的理解 拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?相关推荐

  1. 【C++】何时需要自定义拷贝构造函数和赋值符

    先来说结论:当类中有指针类型成员变量的时候,一定要自定义拷贝构造和赋值运算符 原因:当我们在有指针类成员变量的时候,还是用默认拷贝构造函数(拷贝构造函数执行的时候会调用赋值符),默认赋值为浅拷贝,会导 ...

  2. js中的深浅复制(深浅拷贝、深浅克隆)

    什么是浅复制? --把一个变量赋值给另一个变量,基本数据类型如数字,字符串,布尔值等这些是拷贝值,引用数 据类型如对象,数组,函数等,这些拷贝的是地址. 深复制: 将一个对象从内存中完整的拷贝一份出来 ...

  3. C++自定义拷贝构造函数

    C++为定义的类提供了默认的拷贝构造函数,那么,我们是否还需要自定义拷贝构造函数?首先,来看看下面的一个例子,程序测试代码如下: 程序运行结果如下: 在这个程序中,我们使用new关键字来动态构建一个s ...

  4. 默认拷贝构造函数 与 自定义拷贝构造函数

    拷贝构造 有Person类如下: class Person {char* pName; public:Person(char* pN="noName"){cout<<& ...

  5. 原型、原型对象、构造函数、原型链理解

    1. 基本概念: "原型属性"也可以叫做"原型"(prototype):所有函数都有prototype,我觉得可以理解为python中的类属性,不需要通过实例, ...

  6. python 构造函数 __init__()方法的理解

    用到__init__函数(方法), 首先,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问. 而__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量). ...

  7. python之拷贝(深浅)

    深浅拷贝 深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表.元组.字典等其他数据类型. 数字和字符串 对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址. ...

  8. java的深浅拷贝_Java 深浅拷贝

    Java 深拷贝和浅拷贝 在浅拷贝中,如果原型对象的成员变量是基本类型时,将复制一份给克隆对象:如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员 ...

  9. 批量拷贝文件到服务器,Syncovery(数据备份工具)如何在windows下远程访问服务器批量拷贝文件?Syncovery图文教...

    打开找到你的test文件夹,复制你上面的地址:\\10.0.2.38\test 如图5 图5 重新打开SynCovery软件,点新建Profile ,弹出ProfileSettings对话框,设置参数 ...

最新文章

  1. mysql崩溃恢复过程_一起看下MySQL的崩溃恢复到底是怎么回事
  2. 【】MTCNN基于NCNN的测试过程
  3. 面向对象的数据存储方式
  4. centos中文目录换成英文目录
  5. observable_Java Observable clearChanged()方法与示例
  6. 如何配置Java环境
  7. jdbc odbc连接mysql_具体说明JDBC连接数据库与ODBC连接数据的区别
  8. java代码混淆(使用 ProGuard maven插件)
  9. java语言简介总结
  10. 励志,一年绝境翻盘,大厂的逆袭之路
  11. 2020-08-17:为什么HashMap中数组的容量为2的次幂?
  12. U3D-3D MAX Biped导出.fbx到Unity的Humanoid的骨架不匹配(Disable Triangle Pelvis, Enable Triangle Neck)
  13. python npv 计算公式_PMP知识点总结 -- 净现值(NPV)
  14. Office 2003 sp3(CVE-2012-0158)漏洞分析报告
  15. FreeBSD硬盘分区和数据迁移相关资料
  16. MySQL 学习笔记(四)——查询练习
  17. java基于springboot+vue的社区居民健康管理系统 nodejs 前后端分离
  18. 敏捷开发之Scrum
  19. 小程序样式text:after不起作用。在开发者工具看不到样式
  20. 图片Base64编码血泪教训

热门文章

  1. 简单两步解决nginx+php 的高并发502问题(nginx限流,定时重启php-fpm)
  2. Java中byte类型的范围
  3. 网络游戏服务器构架设计(三):刀剑Online - 总控服务器、场景服务器
  4. android多分辨率多密度,android多分辨率多密度下界面适配方案
  5. 有什么性价比很高的百元耳机?性价比极高的百元耳机推荐
  6. 红薯代替米饭,一个月能瘦8斤
  7. spring自动装配Bean的五种方式
  8. JS--对象数组深拷贝的方法
  9. Sorting 排序详解(c语言实现)
  10. 6套优质教学课件PPT模板,教育者的福利