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;
} 展开
#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;
} 展开
5个回答
展开全部
程序第39行,people的构造函数里面有一行
date birthday(1);
建立了一个date类的临时变量。
当函数退出的时候,这个变量也会被撤销,所以执行了date的析构函数
date birthday(1);
建立了一个date类的临时变量。
当函数退出的时候,这个变量也会被撤销,所以执行了date的析构函数
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你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";
}
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";
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
构造函数是创建的时候也就是new的时候调用,析构是释放也就是delete的时候调用,你new的话应该是调用构造函数 也就是
date()
{};
date(int i)
{
cout<<"请输入出生年月日:";
cin>>year>>month>>day;
};
date()
{};
date(int i)
{
cout<<"请输入出生年月日:";
cin>>year>>month>>day;
};
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p1.~point(); 你自己调用了一次,但是没有析构对象
主函数结尾,程序结束前,销毁对象自动调用析构函数,构造了两个对象调用两次
希望能解决您的问题。
主函数结尾,程序结束前,销毁对象自动调用析构函数,构造了两个对象调用两次
希望能解决您的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
析构函数在类创建出来的对象的生命周期结束的时候将会被调用。
析构函数在类创建出来的对象的生命周期结束的时候将会被调用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询