各位帮个忙,帮我看一下问题出在哪

jsmoke123 2010-05-20 09:17:15
class A
{
public A() {x=new int;*x=5;}
~A(){delete x;x=0;}
A(const A&a)
{ x=new int
*x=*(a.x)
}
void print()const{cout<<*x<<endl;}
void set(int i){*x=i}
private:
int *x;
};
int main()
{
A*a=new A();

A b=(*a);
return 0;

}
浅层复制构造函数 A b=(*a) 只句代码不是建了对象b,然后把a对象赋值给b 既然建立了对象b 那么不是要调用构造函数public A() {x=new int;} b对象x指针不是指向了一个新的空间了吗,为什么还要在复制构造函数中 再用x=new int 让b指向另一个空间 呢
...全文
85 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
patricxuqi 2010-05-20
  • 打赏
  • 举报
回复
建立对象b的时候是通过调用类的“拷贝构造函数”建立的,不是通过a对象的构造函数!!!
linwu871105 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jsmoke123 的回复:]

那就不是要出错吗,A b=(*a) 这句代码不是建了对象b吗,构造函数里A() {[b]x=new int;*x=5;}
不是给对象b的成员变量新空间了吗? 对象b的成员变量的地址和对象a的成员变量的地址不是不一样了吗?
引用 8 楼 pengzhixi 的回复:
引用 5 楼 jsmoke123 的回复:
引用 2 楼 pengzhixi 的回复:
这就是深拷贝啊。


这……
[/Quote]

问题是执行A b=(*a)等价于A b(*a),即是用一个对象初始化另一个对象啊,所以会调用copy函数
jsmoke123 2010-05-20
  • 打赏
  • 举报
回复
那就不是要出错吗,A b=(*a) 这句代码不是建了对象b吗,构造函数里A() {[b]x=new int;*x=5;}
不是给对象b的成员变量新空间了吗? 对象b的成员变量的地址和对象a的成员变量的地址不是不一样了吗?
[Quote=引用 8 楼 pengzhixi 的回复:]
引用 5 楼 jsmoke123 的回复:
引用 2 楼 pengzhixi 的回复:
这就是深拷贝啊。


这样定义A(const A&amp;a)
{
*x=*(a.x)
}
可以吗 ,因为在构造函数中b对象x指针是指向了一个新的空间,我这样理解对吗


即使你想两个指针指向同一段内存也是这么写:x=a.x;
[/Quote]
dinghing 2010-05-20
  • 打赏
  • 举报
回复
得使用深拷贝,在开辟一个空间
pengzhixi 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jsmoke123 的回复:]
引用 2 楼 pengzhixi 的回复:
这就是深拷贝啊。


这样定义A(const A&a)
{
*x=*(a.x)
}
可以吗 ,因为在构造函数中b对象x指针是指向了一个新的空间,我这样理解对吗
[/Quote]

即使你想两个指针指向同一段内存也是这么写:x=a.x;
elegant87 2010-05-20
  • 打赏
  • 举报
回复
深拷贝的自己写写。
jsmoke123 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]
防止两个对象的指针成员指向同一内存,当一个对象超出作用域被析构的时候那么另外一个对象的指针成员就悬空了。
[/Quote]这样定义A(const A&a)
{
*x=*(a.x)
}
可以吗 ,因为在main函数中 A b=(*a) 这句代码不是建了对象b吗,然后把a对象赋值给b 既然建立了对象b 那么不是要调用构造函数 A() {x=new int;} b对象x指针不是指向了一个新的空间了吗
jsmoke123 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]
这就是深拷贝啊。
[/Quote]

这样定义A(const A&a)
{
*x=*(a.x)
}
可以吗 ,因为在构造函数中b对象x指针是指向了一个新的空间,我这样理解对吗
_SNIPER_ 2010-05-20
  • 打赏
  • 举报
回复
属于深复制吧
pengzhixi 2010-05-20
  • 打赏
  • 举报
回复
防止两个对象的指针成员指向同一内存,当一个对象超出作用域被析构的时候那么另外一个对象的指针成员就悬空了。
pengzhixi 2010-05-20
  • 打赏
  • 举报
回复
这就是深拷贝啊。
jsmoke123 2010-05-20
  • 打赏
  • 举报
回复
错了,是深层复制

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧