鱼C论坛

 找回密码
 立即注册
查看: 4850|回复: 3

求助副本构造器

[复制链接]
发表于 2012-11-25 14:02:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>

class Test
{
public:
  Test(int *x);
  Test(const Test &x);
  ~Test();
  Test &operator=(const Test &x);
protected:
  int * prt;
};

Test::Test(int *x)
{
  std::cout<<"进入构造器"<<std::endl;
  prt = x;
  std::cout<<"离开构造器"<<std::endl;
}
Test::~Test ()
{
   std::cout<<"进入析构器" <<std::endl;
   std::cout<<'*'<<prt<<'='<<*prt<<std::endl;
   std::cout<<"离开析构器" <<std::endl;
}
Test &Test::operator=(const Test &x)
{
   if(this==&x)
     std::cout<<"不能向同一个地址复制"<<std::endl;
   else
   {
      delete prt;
      prt=new int(*x.prt);

   }
   return *this;
}
Test::Test(const Test &x)
{  
   std::cout<<"进入副本构造器"<<std::endl;
   *this=x;
   std::cout<<"离开副本构造器"<<std::endl;
}
int main()
{
   Test a(new int(50));
   Test c=a;
}

各位大大 帮忙看下这个有什么错 谢谢了

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-25 18:42:36 | 显示全部楼层
求助求助求助
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-26 09:30:12 | 显示全部楼层
副本构造器调用operator==函数,该函数delete prt的时候,prt还是个野指针,所以报错.一个简单的改法如下:
  1. #include <iostream>

  2. class Test
  3. {
  4. public:
  5.         Test(int *x);
  6.         Test(const Test &x);
  7.         ~Test();
  8.         Test &operator=(const Test &x);
  9. protected:
  10.         int * prt;
  11. };

  12. Test::Test(int *x)
  13. {
  14.         std::cout<<"进入构造器"<<std::endl;
  15.         prt = x;
  16.         std::cout<<"离开构造器"<<std::endl;
  17. }
  18. Test::~Test ()
  19. {
  20.         std::cout<<"进入析构器" <<std::endl;
  21.         std::cout<<'*'<<prt<<'='<<*prt<<std::endl;
  22.         std::cout<<"离开析构器" <<std::endl;
  23. }
  24. Test &Test::operator=(const Test &x)
  25. {
  26.         if(this==&x)
  27.                 std::cout<<"不能向同一个地址复制"<<std::endl;
  28.         else
  29.         {
  30.                 delete prt;
  31.                 prt=new int(*x.prt);
  32.                
  33.         }
  34.         return *this;
  35. }
  36. Test::Test(const Test &x)
  37. {  
  38.         std::cout<<"进入副本构造器"<<std::endl;
  39.         prt = new int(0);//加上这行
  40.         *this=x;
  41.         std::cout<<"离开副本构造器"<<std::endl;
  42. }
  43. int main()
  44. {
  45.         Test a(new int(50));
  46.         Test c=a;
  47. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-26 10:27:47 | 显示全部楼层
谢谢了谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-16 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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