标题:拷贝构造函数到底什干什么的?
只看楼主
qwerwqily
该用户已被删除
已结贴  问题点数:20 回复次数:10 
拷贝构造函数到底什干什么的?
提示: 作者被禁止或删除 内容自动屏蔽
搜索更多相关主题的帖子: 函数 构造 拷贝 
2010-11-27 11:50
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:15 
拷贝构造函数是每个类里面不可缺少的函数  就像构造函数和析构函数一样
如果你不在类里面加上 那么编译系统也会自动给你加上一个默认的
它的作用是用来把一个类的对象的数据成员复制到另一个相同的类的对象中去
但是他跟“=”又是不一样 =是用来单纯的赋值
而如果你用一个对象去初始化另一个对象时调用的不是=这个运算符  而是拷贝构造函数 如下
class A
{private:
   int a;
public:
   A();
   A(&A);
   ~A();
};
A a1,a2;
A a3=a1;
第一句调用的是构造函数  第二句调用的是拷贝构造函数   第三句调用的是赋值运算符
拷贝构造函数的调用时机有三个  
1.用一个对象去初始化另一个对象时
2.当函数的返回值是对象时 调用去对临时的对象赋值
3.当函数的参数是对象时  调用去对形参进行赋值  
讲的还可以吧   绝对不是抄的

                                         
===========深入<----------------->浅出============
2010-11-27 12:34
qwerwqily
该用户已被删除
得分:0 
回复 2楼 laoyang103
提示: 作者被禁止或删除 内容自动屏蔽
2010-11-27 12:37
qwerwqily
该用户已被删除
得分:0 
回复 2楼 laoyang103
提示: 作者被禁止或删除 内容自动屏蔽
2010-11-27 12:43
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
得分:0 
那剩下的一半就给我了。悄悄的告诉你有一些你认为对的其实却是错误的,关于类的详细阐述看Inside The C++ Object Model
对C++对象模型的讲解、

离恨恰如春草,更行更远还生。
2010-11-27 12:49
qwerwqily
该用户已被删除
得分:0 
回复 5楼 玩出来的代码
提示: 作者被禁止或删除 内容自动屏蔽
2010-11-27 12:50
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
得分:0 
这东西不是一两句就可以说清楚的,或者现在你可以先不用管,但是看书时不要把所有都当做真理,或许某天你会发现你一直认为对的到后来才发现是错的,就很郁闷了。就如初中时看的一些事情他就是那样,没错,但到高中你会知道其实有些东西当时没有给你讲到深处,你还是没理解他的多种情况,本质。

离恨恰如春草,更行更远还生。
2010-11-27 12:58
淑人公子
Rank: 1
等 级:新手上路
帖 子:9
专家分:5
注 册:2010-11-27
得分:5 
楼主可能不知道复制构造函数和赋值运算符的区别,当浅拷贝时它就相当于赋值运算符,因为不需要另外开辟的空间,而深拷贝时就必须用复制构造函数了,比如你用一个对象去初始化另一个对象a=b,若不用构造函数则相当于把对象b里面数据成员的地址也给了a,而我们想要的是b里面数据的值,把这些值放到a开辟的空间里,因为如果a和b有相同的地址的话,把b delete了,那a也不能用了
2010-11-27 13:26
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:0 
对拉  补充一点   关于深拷贝与浅拷贝
class A
{private:
   int a;
   char *p;
public:
   A();
   A(& a0);
   ~A();
};
A::A()
{
   p=new char[10];
}
那么如果拷贝构造函数是:
A::A(A &a0)
{
   a=a0.a;
   p=a0.p;
}
那么就会使两个指针指向同一段堆内存  如果此时用一个指针释放那段内存就会使另一个指针悬空
就会出现错误(可导致程序崩溃)
所以拷贝构造函数应该这样写
A::A(A &a0)
{
   delete []p;
   p=new char[strlen(a0.p)];
   strcpy(p,a0.p);
   a=a0.a;
}
这样就可以是两个指针指向不同的内存区域   但是两段内存区域的内容是不相同的   明白吗

                                         
===========深入<----------------->浅出============
2010-11-27 18:19
无名可用
Rank: 4
等 级:业余侠客
帖 子:79
专家分:259
注 册:2010-7-27
得分:0 
赞同9楼,当类含有指针成员时,要用深拷贝啊。
2010-11-27 22:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-327045-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.225046 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved