C++中析构函数在成员函数中的调用问题

这样写一段代码:#include<cstdio>classab{public:int*x;ab(){x=newint[2];}~ab(){delete[]x;}voido... 这样写一段代码:
#include <cstdio>
class ab
{
public:
int *x;
ab()
{
x=new int[2];
}
~ab()
{
delete []x;
}
void operator = (int a)
{
x[0]=a;
}
};

int main()
{
ab a;
a=3;
printf("%d\n", a.x[0]);
return 0;
}
输出值为 3

但是如果改为
#include <cstdio>
class ab
{
public:
int *x;
ab()
{
x=new int[2];
}
~ab()
{
delete []x;
}
ab operator = (int a)
{
x[0]=a;
return *this;
}
};
int main()
{
ab a;
a=3;
printf("%d\n", a.x[0]);
return 0;
}
输出值为随机数并且显示执行了两次析构函数,请问为什么?
展开
 我来答
wwwgmc
2014-11-09 · TA获得超过321个赞
知道小有建树答主
回答量:247
采纳率:0%
帮助的人:171万
展开全部

赋值运算符改为:

	ab& operator = (int a)
{
x[0]=a;
return *this;
}

就OK了。

赋值运算符的返回值不是引用的话,return *this;时会调用隐式拷贝构造函数:

ab(const ab &t)
{
    x=t.x;    //对象a的x和临时对象的x的值是一样的
}

生成类ab的临时对象,临时对象析构时,临时对象的x[0]变为随机数,因为对象a的x和临时对象的x的值是一样的,所以a.x[0]也变为随机数了。对象a也析构了一次,所以析构了两次。

追问
确实是这样的,现在理解了。
但是最佳答案只有一个,抱歉
还是十分感谢,
百度网友d585d01
推荐于2017-12-15 · TA获得超过670个赞
知道小有建树答主
回答量:339
采纳率:0%
帮助的人:470万
展开全部
因为第二种方法你没有定义拷贝构造函数,所以ab operator = (int a)执行完之后,返回的是return *this,会在内存中再次构造一个ab的对象,并且把*this指向的对象按位拷贝给这个对象,创建这个对象的时候,会用到x=new int[2]分配一段内存。由于有a=3;会再次调用按位拷贝函数把这个对象幅值给a,赋值完成后,这个对象析构,所以它的成员被重置为随机数,a中x所指向的也为随机数(因为是按位拷贝的)所以输出为随机数。你可以把ab operator = (int a)这个函数的返回值改为引用类型,就可以输出不是随机数,即:ab& operator = (int a)
追问
请问拷贝函数如何写?
ab(const ab &a)
{
x[0]=a.x[0];
}
这样写会出错
追答
  ab(const ab&a)
  {
  x=new int[2];
  x[0]=a.x[0];   
  }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nionydas
2014-11-09 · TA获得超过459个赞
知道小有建树答主
回答量:272
采纳率:0%
帮助的人:349万
展开全部
ab operator = (int a)
{
x[0]=a;
return *this;
}

这里返回的是*this 那么返回类型肯定是对ab类对象的一个引用啊,需要改成
ab& operator = (int a)
{
x[0]=a;
return *this;
}
才行
追问
十分感谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式