先看代码:

#include <iostream>
#include <string>
using namespace std;
class CMessage{
public:char *ShowIt(){return pmessage;}CMessage(const char *text = "Default message"){//默认构造函数pmessage = new char[strlen(text) + 1];strcpy_s(pmessage, strlen(text) + 1, text);}CMessage(const CMessage &aMess){//复制构造函数,这个必须有!!!size_t len = strlen(aMess.pmessage) + 1;pmessage = new char[len];strcpy_s(pmessage, len, aMess.pmessage);}~CMessage();
private:char *pmessage;
};CMessage::~CMessage(){//析构函数cout << "Destructor called." << endl;delete[] pmessage;
}void DisplayMessage(CMessage localMsg){cout << "The message is: " << localMsg.ShowIt();
}int main(){CMessage m1("This is a message");DisplayMessage(m1);CMessage m2(m1)//如果没有复制构造函数,会出错cout << m2.ShowIt() << endl;return 0;
}

程序输出:

过程:
1. 创建 m1 对象,在空闲存储器中为消息 “This is a message” 分配空间。
2. 调用 DisplayMessage() 函数。因为实参是通过传值方式传递的,所以使用默认复制构造函数创建实参副本 localMsg 。现在,副本中的指针指向空闲存储器中原来的对象所指向的字符串。
3. DisplayMessage() 函数结束时,局部对象 localMsg 超出作用域,因此程序调用 CMessage 的析构函数,通过释放 pmessage 指针指向的内存,删除这个局部对象(副本)。
4. 从 DisplayMessage() 函数返回时,原来的对象 m1 包含的指针仍然指向刚释放的内存区域。下次再使用原来的对象(就算不使用该对象,它也会被删除)时,程序将表现出异常的行为。

注:必须使用拷贝构造函数的三种情况:
(1)用类的一个对象去初始化另一个对象时
(2)当函数的形参是类的对象时(也就是值传递时),如果是引用传递则不会调用
(3)当函数的返回值是类的对象或引用时

C++——必须使用复制构造函数的情况相关推荐

  1. 【C++】复制构造函数

    参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题) 用到复制构造函数的情况: 1.函数值传递 2.返回对象 3.用一个对象初始化另一个对象 重点注意下面两种情况: ① 只调 ...

  2. C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    转载自:http://blog.csdn.net/jofranks/article/details/17438955 版权声明:本文为博主原创文章,未经博主允许不得转载. 在C++中,有三大函数复制控 ...

  3. 6.12C++:继承基类的构造函数、单继承的构造函数、多继承的构造函数、派生类复制构造函数、派生类的析构函数

    1 继承基类的构造函数 class A{public:A(){}; // A的构造函数 }; class B : public A{public:using A:A: } 2 单继承的构造函数 cla ...

  4. VC++复制构造函数使用的三种情况—整理范磊VC++

    1 上面不执行复制构造函数,17行将10000赋值给a:首先是进行类型转换转化为类(等价18行),然后调用构造函数创建一个临时对象, 并将该临时对象赋给a. 2. 对func函数: 接收的实参是主函数 ...

  5. 复制构造函数(拷贝构造函数)

    也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生.对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什 ...

  6. C++深复制(深拷贝)、浅复制(浅拷贝)和复制构造函数(拷贝构造函数)详解+实例

    转载出处:https://blog.csdn.net/sxhelijian/article/details/23209967 对象的复制 对于普通类型的对象来说,它们之间的复制是很简单的,例如: in ...

  7. C++拷贝构造函数(复制构造函数)详解

    link 复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数.大多数情况下,其作用是实现从源对象到目 ...

  8. 复制构造函数 与 赋值函数 的区别

    构造函数.析构函数.赋值函数是每个类最基本的的函数.每个类只有一个析构函数和一个赋值函数.但是有很多构造函数(一个为复制构造函数,其他为普通构造函数.对于一个类A,如果不编写上述四个函数,c++编译器 ...

  9. 编译器角度看C++复制构造函数

    [C++对象模型]复制构造函数的建构操作 关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义.调用时机.也对编译器合成的复制构造函数行为 ...

最新文章

  1. 深度学习100问:图像语义分割有哪些经典的上采样方法?
  2. 赵劲松:预知潜在风险,做化工安全科技创新的引领者
  3. 【JPA】注解@PostConstruct、@PreDestroy
  4. js输出php文件大小,前端js实现文件的断点续传 后端PHP文件接收
  5. 安装eclipse中html/jsp/xml editor插件以及改动html页面的字体
  6. 在DELL服务器上升级ESXI 5.5
  7. gtest hook 示例
  8. Java校招笔试题-Java基础部分(一)
  9. 陆奇、雷军、熊晓鸽聊疫情后的创业风口
  10. websocket传输数据大小限制_WebSocket基础知识笔记
  11. 计算机网络物理层之数字传输系统
  12. Opencv打开相机,并在上面用鼠标画框
  13. win7中文版转英文版 只须下载安装语言包
  14. Android修行手册-TextView常用属性篇
  15. 批量修改图幅lisp_【CAD应用技巧】批量自动修改图形文件的程序
  16. java 取余 负数_Java中有关负数取余的计算
  17. python将英文翻译为中文_Python使用百度翻译开发平台实现英文翻译为中文功能示例...
  18. c++中string的assign方法使用
  19. 初学CAD,该如何正确查看CAD图纸呢?
  20. Java多线程 | 详解ThreadLocal实现原理

热门文章

  1. python矩阵中的冒号:
  2. 吴恩达 神经网络和深度学习 第一课 第三周 (代码)planar data classify
  3. Linux定期执行xshell脚本(入门)
  4. phpcms v9 sql数据{$r[content]},前端如何换行显示?
  5. 代码注释: (文字图案:HIRE)
  6. Win10 + VSCode踩坑 + vue项目开发:设置vscode终端为管理员权限
  7. WordPress主题:Zibll子比主题 V4.0 绿色版
  8. simpla是基于laravel5的php,一个基于laravel5.1的后台
  9. 怎么创建python django项目_python怎么创建django
  10. Video视频背景设计企业模板