关于析构函数的疑惑~

aj2dding 2010-04-24 05:57:53
程序如下:
#include <iostream.h>
#include <string.h>

class B
{
public:
B(char *s,double n)
{
strcpy(name,s);
b=n;
cout<<"Constructor\n";
}
B()
{
cout<<"Default Constructor\n";
}
~B()
{
cout<<"Destructor "<<name<<endl;
}
void getb(char *s,double& n)
{
strcpy(s,name);
n=b;
}
private:
char name[80];
double b;
};

void main()
{
B *p;
double n;
char s[80];

p=new B[3];
p[0]=B("ma",4.8);

//p[1]=B("wang",3.6);
//p[2]=B("li",3.1);

//delete[] p;

}

//运行结果如下:
Default Constructor
Default Constructor
Default Constructor
Constructor
Destructor ma

//我的问题是:为什么在p[0]=B("ma",4.8);执行完成后,要调用一次析构函数呢?谢谢
...全文
51 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2010-04-24
  • 打赏
  • 举报
回复
p[0]=B("ma",4.8);

这里B("ma",4.8)是个临时对象。
aj2dding 2010-04-24
  • 打赏
  • 举报
回复
嗯.明白了,是在用B("ma",4.8);产生的临时对象赋完值后就被析构掉了,谢谢

pengzhixi 2010-04-24
  • 打赏
  • 举报
回复
不是将地址赋给他是调用了赋值运算符
aj2dding 2010-04-24
  • 打赏
  • 举报
回复
1楼,2楼的朋友:
我这样理解对否
B("ma",4.8);
是产生了无名称的B类对象,所以在将新对象地址赋给p[0]后,将这个无名称的B类对象析构掉了.
贪食蛇男 2010-04-24
  • 打赏
  • 举报
回复
p=new B[3];
时候调用默认无参构造器填充了数组,p[0]时手动指定数组中第一个元素,原来默认的填充对象被顶替掉,应该是被顶替掉的那家伙的析构吧.
pengzhixi 2010-04-24
  • 打赏
  • 举报
回复
B("ma",4.8);//是临时对象所以要析构
eatsweetpotato 2010-04-24
  • 打赏
  • 举报
回复
因为产生了临时对象,进行完赋值操作该临时对象就会析构掉

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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