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

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
...全文
67 点赞 收藏 6
写回复
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日
问题在哪?
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告