鱼C论坛

 找回密码
 立即注册
查看: 4460|回复: 4

副本构造器问题

[复制链接]
发表于 2012-12-7 17:40:43 | 显示全部楼层 |阅读模式
1鱼币

定义一个包含指针的类,然后生成两个对象,然后复制一下,再让一个对象删除,但是另一个对象仍然可以正常使用指针

为什么呢

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Base
  5. {   public:
  6. int a;
  7. int *p1;
  8. Base(int b);
  9. void math();
  10. ~Base();
  11. };
  12. Base::Base(int b)
  13. {
  14.    this->a=b;
  15.     p1=&a;
  16. }
  17. Base::~Base()
  18. {   
  19. std::cout<<"要删了\n";

  20. }
  21. void Base::math()
  22. {
  23. std::cout<<"你多大??\n";
  24. std::cout<<p1<<"\n";
  25. std::cout<<"我有"<<*p1<<"岁了\n";  
  26. }
  27. int main()
  28. {   

  29. Base base1(888);
  30. base1.math();
  31. {
  32.   Base base2(999);
  33.   base2.math();
  34.   base1=base2; //对象复制
  35. }         // 程序到这里的时候 base2已经消除了
  36.    
  37. base1.math();// 为什么还可以使用从base2复制过来的指针P1




  38. return 0;
  39. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-9 12:10:31 | 显示全部楼层
P1是在构造函数里面定义的,也就是base1和base2都有这个属性的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-9 12:39:36 | 显示全部楼层
楼主,不知道你的那句“程序到这里的时候 base2已经消除了”指的是什么,这儿的话,base2对象应该没有消除,base1=base2;这句以我以前学java的时候理解,这个只是将base2的地址传给了base1,所以base1现在指向的地址是base2中的,即base1和base2是完全一样的了,so,如果你再调用base2的话,仍然能够调用,而且不只是能调用指针p1,反而到这儿base1的实际对象却“不见了”,因为它现在指向了base2,在java中的话叫对象的引用。希望能解决你的疑惑。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-15 18:00:18 | 显示全部楼层
base1=base2; //对象复制
这里为调用浅拷贝构造函数。base1.p1=base2.p1 这样就调用的同样的地址。要重新定义拷贝构造函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-15 21:05:53 | 显示全部楼层
这个代码本身就是错的,base2对象已经被析构,不能再使用了。你之所以用了没出问题主要是运气好,系统还仅仅只是标记下base2对象已死,还没有真的回收它的空间。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表