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;
}
输出值为随机数并且显示执行了两次析构函数,请问为什么? 展开
#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;
}
输出值为随机数并且显示执行了两次析构函数,请问为什么? 展开
3个回答
展开全部
赋值运算符改为:
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也析构了一次,所以析构了两次。
追问
确实是这样的,现在理解了。
但是最佳答案只有一个,抱歉
还是十分感谢,
展开全部
因为第二种方法你没有定义拷贝构造函数,所以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];
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ab operator = (int a)
{
x[0]=a;
return *this;
}
这里返回的是*this 那么返回类型肯定是对ab类对象的一个引用啊,需要改成
ab& operator = (int a)
{
x[0]=a;
return *this;
}
才行
{
x[0]=a;
return *this;
}
这里返回的是*this 那么返回类型肯定是对ab类对象的一个引用啊,需要改成
ab& operator = (int a)
{
x[0]=a;
return *this;
}
才行
追问
十分感谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询