复制构造函数必须将形参指定为 const 引用

若复制构造函数写成如下:

CBox(CBox initB);

由于是按值传递,所以编译器会首先创建对象的副本,而创建对象的副本需要调用复制构造函数,又会创建新的对象,新对象又会调用复制构造函数

会持续不休,最终得到对复制构造函数的无穷调用。

解决方法如下:

CBox(const CBox & initB);

由于是引用形参,因此没有复制发生,const 限定符用来确保该函数不能修改实参。

class CMessage
{
private:char * m_pMessage;public:void showIt()const{cout << m_pMessage << endl;}
    //构造函数
    CMessage(const char* text="Default message"){size_t length{strlen(text)+1};m_pMessage = new char[length+1];strcpy_s(m_pMessage,length+1,text);}//析构函数~CMessage(){cout << "Destructor called" << endl;delete[]m_pMessage;}
};void displayMessage(CMessage localMsg)
{cout <<"the message is:" << endl;localMsg.showIt();
}int main()
{CMessage thought{"Amiss is as good as a mile"};displayMessage(thought);thought.showIt();return 0;
}    

运行上面程序我们会发现出现异常,原因是因为在 displayMessage(CMessage localMsg) 函数调用中按值传递创建了实参的副本,

而由于使用默认复制构造函数,对象和对象的副本的数据成员 m_pMessage,共同指向同一块内存区域。

displayMessage(CMessage localMsg)函数中的对象副本在离开函数后便调用析构函数用 delete[]m_pMessage 释放了内存。

所以 thought 对象的数据成员也被释放了。

下面代码依旧同样的问题:

class CMessage
{
private:char * m_pMessage;public:void showIt()const{cout << m_pMessage << endl;}CMessage(const char* text="Default message"){size_t length{strlen(text)+1};m_pMessage = new char[length+1];strcpy_s(m_pMessage,length+1,text);}~CMessage(){cout << "Destructor called" << endl;delete[]m_pMessage;}
};int main()
{CMessage motto1{"Amiss is as good as a mile"};CMessage motto2{motto1};return 0;
}

解决办法:建立自己的复制构造函数

CMessage(const CMessage & aMess)
{size_t len{strlen(aMess.m_pMessage)+1};this->m_pMessage = new char[len];strcpy_s(m_pMessage,len,aMess.m_pMessage);
}

转载于:https://www.cnblogs.com/yunqie/p/5934928.html

对象 复制构造函数相关推荐

  1. VC++之对象含指针成员指向堆空间并调用复制构造函数问题—参考范磊VC++

    1. 对象a,b都是在堆中创建的. 对象a是直接在堆中创建. 对象b是调用b的复制构造函数并成为对象a的一份拷贝. 问题出在复制构造函数定义中: 1)这种定义会导致a,b对象中的成员变量指向同一块堆内 ...

  2. C++ 复制构造函数或者拷贝构造函数

    复制构造函数 是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象. 复制构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象. 复制对象把它作为参数传 ...

  3. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)

    1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...

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

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

  5. php5对象复制、clone、浅复制与深复制的区别与介绍

    对象复制的由来  为什么对象会有"复制"这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 * /**      * * 电视机类     ...

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

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

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

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

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

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

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

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

  10. 原型模式(ProtoType) - Java里的对象复制

    一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...

最新文章

  1. C/C++如何传递二维数组?
  2. 苹果系统更新服务器繁忙,如何解决升级MacOS 10.13时的常见问题
  3. 【python数字信号处理】——scipy库设计滤波器(IIR为例)、绘制滤波器频谱响应、IIR滤波器滤波、读写wav音频文件
  4. python数据库框架_目前最受欢迎的12个Python开源框架
  5. hdu 1872 稳定排序
  6. Node.js入门 - 回调函数
  7. php checkbox表单提交,HTML表单Checkbox的值如何正确提交到PHP后台?,需要技巧
  8. eclipse中快捷搜索文件快捷键
  9. unidac连接ORACLE免装客户端驱动
  10. Nginx配置文件(作为Web服务器)
  11. 4矩阵键盘c语言程序,4×4矩阵键盘数码管显示按键值程序
  12. c语言补偿算法,C功能刀具半径补偿算法与实现.doc
  13. webpack随笔04-webpack5压缩jscss
  14. 共射极单管放大器的Multisim仿真实验
  15. 基于MATLAB去理解掌握傅里叶级数和傅里叶变换
  16. 字符串流stringstream--<sstream>
  17. tensorflow2.10.0+CUDA11.2+cuDNN8.1 for cuda11.2
  18. 视觉伺服控制工具Visual Servoing Platform---VISP(2)----使用ViSP滤波图像。
  19. 分布式系统理论基础 - CAP
  20. 人机混合智能的哲学思考

热门文章

  1. 页面之间传输大量数据
  2. MySQL数据库优化技术之数据库表的设计
  3. svn: No repository found in 'svn:..解决方案
  4. DIV+CSS网页设计布局应用详解视频教程
  5. leetCode:35. 搜索插入位置
  6. Vova and Train (codeforces 1066A)
  7. 洛谷P3216 [HNOI2011]数学作业
  8. UVA 1584 环状序列
  9. python安装BeautifulSoup注意事项
  10. 你应该知道的Linux历史