新手提问:关于析构函数和构造函数问题

sw98 2004-12-27 05:08:19
#include <iostream.h>
class b
{
int x,y;
public:
b(){x=y=0;cout<< "constructor1"<<endl;}
b(int i) {x=i;y=0;cout<<"constructor2"<<endl;}
b(int i,int j) {x=i;y=j;cout<<"constructor3"<<endl;}
~b(){cout<<"destructor"<<endl;}
void print()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};
void main()
{
b *ptr;
ptr=new b[3];
ptr[0]=b();
ptr[1]=b(5);
ptr[2]=b(2,3);
for (int i=0;i<3;i++)
ptr[i].print();
delete[] ptr;
}
为什么显示结果为
constructor1
constructor1
constructor1
constructor1
destructor
constructor2
destructor
constructor3
destructor
x=0,y=0
xd=5,y=0
x=2,y=3
destructor
destructor
destructor
...全文
103 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
macrod 2004-12-27
  • 打赏
  • 举报
回复
ptr[0]=b();
ptr[1]=b(5);
ptr[2]=b(2,3);
等号右边的都是临时对象。
sw98 2004-12-27
  • 打赏
  • 举报
回复
为什么会产生临时对象呀,他还没起作用就调用析构函数了
qhgary 2004-12-27
  • 打赏
  • 举报
回复
ptr=new b[3]; 导致b()3次调用,所以出现3行连续constructor1
ptr[0]=b();
ptr[1]=b(5);
ptr[2]=b(2,3);
的意思是先构造一个b的临时对象,然后把这个对象再赋值给ptr[i]。注意,你这个ptr[0],ptr[1],ptr[2]不是指针,分别代表3个对象。在赋值结束之后,临时对象会被析够,所以会有destructor的调用。


for (int i=0;i<3;i++)
ptr[i].print(); 对应从x=0,y=0到x=2,y=3那几行
delete[] ptr; 对应那3个destructor

macrod 2004-12-27
  • 打赏
  • 举报
回复
我也是个低手,但我认为我足以回答你的问题而不需要高手了,因为高手肯定懒得答这个题。

constructor1 //new b[3] 调用无参数构造函数
constructor1 //同上
constructor1 //同上
constructor1 //ptr[0]=b() 调用无参数构造函数
destructor //析构 b() 产生的临时对象
constructor2 //ptr[1]=b(5) 调用单参数构造函数
destructor //析构 b(5) 产生的临时对象
constructor3 //ptr[2]=b(2,3) 调用二参数构造函数
destructor //析构 b(2,3) 产生的临时对象
x=0,y=0 //
x=5,y=0 //
x=2,y=3 //输出每个对象
destructor //b[2] 的析构函数
destructor //b[1] 的析构函数
destructor //b[0] 的析构函数
chunhai12 2004-12-27
  • 打赏
  • 举报
回复
ptr=new b[3];
为ptr[3]分配内存,同时调用b()
yuanye2008 2004-12-27
  • 打赏
  • 举报
回复
问题在哪?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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