C++析构函数何时调用

如下的程序,我建立了一个类其中有一个对象成员,运行时我发现在对象刚刚构造完成后,即people*p=newpeople[n];每执行一次,类date都会调用它自己的析构函... 如下的程序,我建立了一个类其中有一个对象成员,运行时我发现在对象刚刚构造完成后,即people*p=new people [n];每执行一次,类date都会调用它自己的析构函数,请问这是怎么回事
#include<iostream>
#include<string>
using namespace std;
class date
{
int year;
int month;
int day;
public:
date()
{};
date(int i)
{
cout<<"请输入出生年月日:";
cin>>year>>month>>day;
};
~date()
{
cout<<"成员对象析构成功!\n";
};
void show()
{
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
};
};
class people
{
int number;
string sex;
date birthday;
string id;
public:
people()
{
cout<<"请输入人员编号:";
cin>>number;
cout<<"请输入人员性别:";
cin>>sex;
date birthday(1);
cout<<"请输入人员身份证号:";
cin>>id;
cout<<"对象初始化完成!\n";
};
~people()
{
cout<<"析构完成!\n";
};
people(people&mode)
{
number=mode.number;
sex=mode.sex;
id=mode.id;
birthday=mode.birthday;//调用date类的默认复制构造函数
cout<<"拷贝成功!\n";
};
void show();
};
inline void people::show()
{
cout<<"编号:"<<number<<endl<<"性别:"<<sex<<endl<<"出生日期:";
birthday.show();
cout<<"身份证号:"<<id<<endl;
}
void main()
{
cout<<"请输入想要录入的人员个数:";
int n;
cin>>n;
people*p=new people [n];
people copy(*(p+1));
cout<<"所有人员信息如下:\n";
for(int i=0;i<n;i++)
{
(*(p+i)).show();
cout<<endl;
}
cout<<"复制的人员信息如下:\n";
copy.show();
delete[]p;
}
展开
 我来答
shark_8309
2014-09-05 · TA获得超过1023个赞
知道小有建树答主
回答量:356
采纳率:0%
帮助的人:277万
展开全部
程序第39行,people的构造函数里面有一行
date birthday(1);

建立了一个date类的临时变量。
当函数退出的时候,这个变量也会被撤销,所以执行了date的析构函数
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhangqingxian
2014-09-05 · TA获得超过268个赞
知道小有建树答主
回答量:362
采纳率:0%
帮助的人:303万
展开全部
因为你people的构造函数里构造和析构了一个date对象:
people()
{
cout<<"请输入人员编号:";
cin>>number;
cout<<"请输入人员性别:";
cin>>sex;
date birthday(1);
cout<<"请输入人员身份证号:";
cin>>id;
cout<<"对象初始化完成!\n";
};

上面这个birthday是新创建的一个局部对象,构造函数退出的时候就会释放,所以析构函数被调用了
应该改成:
people() : birthday(1)
{
cout<<"请输入人员编号:";
cin>>number;
cout<<"请输入人员性别:";
cin>>sex;

cout<<"请输入人员身份证号:";
cin>>id;
cout<<"对象初始化完成!\n";
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友62efd0c
2014-09-05 · TA获得超过405个赞
知道小有建树答主
回答量:854
采纳率:0%
帮助的人:605万
展开全部
构造函数是创建的时候也就是new的时候调用,析构是释放也就是delete的时候调用,你new的话应该是调用构造函数 也就是
date()
{};
date(int i)
{
cout<<"请输入出生年月日:";
cin>>year>>month>>day;
};
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户17187
2014-09-05 · TA获得超过162个赞
知道答主
回答量:101
采纳率:0%
帮助的人:84.7万
展开全部
p1.~point(); 你自己调用了一次,但是没有析构对象
主函数结尾,程序结束前,销毁对象自动调用析构函数,构造了两个对象调用两次
希望能解决您的问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
何度千寻
推荐于2016-04-10 · TA获得超过5896个赞
知道大有可为答主
回答量:1381
采纳率:91%
帮助的人:533万
展开全部
  析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
析构函数在类创建出来的对象的生命周期结束的时候将会被调用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式