对象 复制构造函数
复制构造函数必须将形参指定为 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
对象 复制构造函数相关推荐
- VC++之对象含指针成员指向堆空间并调用复制构造函数问题—参考范磊VC++
1. 对象a,b都是在堆中创建的. 对象a是直接在堆中创建. 对象b是调用b的复制构造函数并成为对象a的一份拷贝. 问题出在复制构造函数定义中: 1)这种定义会导致a,b对象中的成员变量指向同一块堆内 ...
- C++ 复制构造函数或者拷贝构造函数
复制构造函数 是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象. 复制构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象. 复制对象把它作为参数传 ...
- C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)
1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...
- 复制构造函数(拷贝构造函数)
也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生.对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什 ...
- php5对象复制、clone、浅复制与深复制的区别与介绍
对象复制的由来 为什么对象会有"复制"这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 * /** * * 电视机类 ...
- C++深复制(深拷贝)、浅复制(浅拷贝)和复制构造函数(拷贝构造函数)详解+实例
转载出处:https://blog.csdn.net/sxhelijian/article/details/23209967 对象的复制 对于普通类型的对象来说,它们之间的复制是很简单的,例如: in ...
- 【C++】复制构造函数
参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题) 用到复制构造函数的情况: 1.函数值传递 2.返回对象 3.用一个对象初始化另一个对象 重点注意下面两种情况: ① 只调 ...
- C++拷贝构造函数(复制构造函数)详解
link 复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数.大多数情况下,其作用是实现从源对象到目 ...
- 复制构造函数 与 赋值函数 的区别
构造函数.析构函数.赋值函数是每个类最基本的的函数.每个类只有一个析构函数和一个赋值函数.但是有很多构造函数(一个为复制构造函数,其他为普通构造函数.对于一个类A,如果不编写上述四个函数,c++编译器 ...
- 原型模式(ProtoType) - Java里的对象复制
一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...
最新文章
- C/C++如何传递二维数组?
- 苹果系统更新服务器繁忙,如何解决升级MacOS 10.13时的常见问题
- 【python数字信号处理】——scipy库设计滤波器(IIR为例)、绘制滤波器频谱响应、IIR滤波器滤波、读写wav音频文件
- python数据库框架_目前最受欢迎的12个Python开源框架
- hdu 1872 稳定排序
- Node.js入门 - 回调函数
- php checkbox表单提交,HTML表单Checkbox的值如何正确提交到PHP后台?,需要技巧
- eclipse中快捷搜索文件快捷键
- unidac连接ORACLE免装客户端驱动
- Nginx配置文件(作为Web服务器)
- 4矩阵键盘c语言程序,4×4矩阵键盘数码管显示按键值程序
- c语言补偿算法,C功能刀具半径补偿算法与实现.doc
- webpack随笔04-webpack5压缩jscss
- 共射极单管放大器的Multisim仿真实验
- 基于MATLAB去理解掌握傅里叶级数和傅里叶变换
- 字符串流stringstream--<sstream>
- tensorflow2.10.0+CUDA11.2+cuDNN8.1 for cuda11.2
- 视觉伺服控制工具Visual Servoing Platform---VISP(2)----使用ViSP滤波图像。
- 分布式系统理论基础 - CAP
- 人机混合智能的哲学思考