关于复制构造函数的作用
时间:2011-12-06
来源:互联网
#include<iostream> using namespace std; class array { public: array(int n); ~array(); array(array &c); int sum(); private: int *p; int number; }; array::array(int n) { number=n; p=new int[n]; cout<<"please input "<<n<< " integer numbers:"<<endl; for(int i=0;i<n;i++) cin>>p[i]; } array::array(array &c) { number=c.number; p=new int[number]; for(int i=0;i<number;i++) p[i]=c.p[i]; } array::~array() {delete []p;} int array::sum() { int temp=0; for(int i=0;i<number;i++) temp+=p[i]; return temp; } int main() { cout<<"please input array size:"; int m; cin>>m; array a(m); cout<<"a sum is "<<a.sum()<<endl; array b(a); cout<<"b sum is "<<b.sum()<<endl; return 0; }
在这个例子里,我看不出复制构造函数array(array &c);
有什么作用。他能完成的功能构造函数也能完成。
有人能举个例子,说明一下复制构造函数存在的必要吗?
什么时候需要用到复制构造函数?
作者: LAST_MAN 发布时间: 2011-12-06
作者: chenhuajie123 发布时间: 2011-12-06
就像你
array a1(n);
array copy_o(a1); //对象copy_o是个新对象,但是初始值和a1一样
而array a2(m);也是个新对象,但是值没有和别的对象一样,是一些默认值。
作者: yby4769250 发布时间: 2011-12-06
在C++中,下面三种对象需要调用拷贝构造函数:
1) 一个对象以值传递的方式传入函数体;
2) 一个对象以值传递的方式从函数返回;
3) 一个对象需要通过另外一个对象进行初始化;
http://baike.baidu.com/view/1266959.htm
上边的意思是说,这个构造函数一般是编译器替你用。但另一个情况下也是用拷贝构造函数的:带参构造函数的初始化列表,一般是采用这种方法赋值
作者: zshtang 发布时间: 2011-12-06
作者: mosal 发布时间: 2011-12-06
array a2 = a1; // 复制构造
array a3(a1); // 复制构造
你如果不自己实现的话, 系统默认也会有的, 但是如果涉及到指针的话,默认的是浅拷贝(只复制指针地址)这样容易造成内存泄露等一些问题。所以有时候要自己实现。
作者: tujiaw 发布时间: 2011-12-06
这个问题已经被讨论过一次
作者: zshtang 发布时间: 2011-12-06
一般在类内部需要进行new操作来给数据成员分配空间的时候才用到自己定义的拷贝构造
例如:C/C++ code
#include <iostream> using namespace std; class base { public: base():pt(NULL){} base(int *p):pt(new int(*p)){} //base(const base &orig):pt(new int(*orig.pt)){} //base& operator = (const base &orig) //{ // pt = new int(*orig.pt); // return *this; //} int Get()const{return *pt;} ~base(){if(NULL != pt)delete pt;pt = NULL;} private: int *pt; }; int main() { int *p = new int(5); base mb1; { base mb2(p); mb1 = mb2; } cout << mb1.Get() << endl; delete p; return 0; }
这个时候就需要提供自己定义的拷贝构造和赋值构造,因为如果你不提供,那么编译器合成的拷贝构造函数只是简单的执行pt = orig.pt操作,不会分配空间,那个对象类的指针成员都指向了同一块内存空间,那么其中一个对象析构之后,另一个对象的指针就变成了悬垂指针了,这样是很危险地,上面这段代码,你可以试试注释掉那几段代码和不注释掉之间的差异。
作者: qscool1987 发布时间: 2011-12-06
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28