C++析构函数调用问题

水能zai舟 2017-03-29 10:49:49
本人C++小白,请见以下代码和图片,系统不是自动调用析构函数吗,第一段代码为什么没有调用析构函数,而第二段代码为什么只调了一次析构函数啊?



//为什么此段程序没有调用析构函数
#include<iostream>
using namespace std;


class CStudent
{
public:
CStudent(int n,int a)
{
num=n;
age=a;
cout<<"construction is running"<<endl;
}
~CStudent() //定义析构函数
{
cout<<"distruction is running"<<endl;
}
void display(CStudent s)
{
s.display();
cout<<"I want to fuck you man"<<endl;
}
void display() //对函数重载
{

cout<<"I want to fuck you man"<<endl;
}
private:
int num;
int age;
};

void main()
{
CStudent stu1(1,1),stu2(1,2);
stu1.display(); //此时没有参数
system("pause");
}





//为什么这段程序只调用了一次析构函数
#include<iostream>
using namespace std;


class CStudent
{
public:
CStudent(int n,int a)
{
num=n;
age=a;
cout<<"construction is running"<<endl;
}
~CStudent() //定义析构函数
{
cout<<"distruction is running"<<endl;
}
void display(CStudent s)
{
s.display();
cout<<"I want to fuck you man"<<endl;
}
void display() //函数重载
{

cout<<"I want to fuck you man"<<endl;
}
private:
int num;
int age;
};

void main()
{
CStudent stu1(1,1),stu2(1,2);
stu1.display(stu2); //此处有参数
system("pause");
}


...全文
780 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbz不是我啊 2020-06-18
  • 打赏
  • 举报
回复
至于为什么第二次调用了,是因为调用display(CStudent  s)的时候,生成了局部对象,当跳出此函数时,会进行销毁,然后就调用了析构函数。 至于为什么少调用了析构函数,可能时应为使用了system("pause")的原因,当我在dev上运行时,使用int main(),然后返回值是0,此时程序返回了正确的结果。
draculamx 2018-07-05
  • 打赏
  • 举报
回复
void main()
{
CStudent stu1(1,1),stu2(1,2);
stu1.display(stu2); //此处有参数
system("pause");
} //当这个括号结束以后 stu1,stu2才会调用析构函数,但是在这之前system("pause");已经结束,所以这两个对象的析构函数,你都看不到输出的

那么控制台里面输出的那个析构函数是谁的呢??


void display(CStudent s);
你的display函数把对象做为参数,所以传入的对象,是进行了一次拷贝的,当这个函数结束以后,拷贝的对象会释放,所以会调用析构函数,也就是你在控制台看到的那个析构函数输出了

如果你真的想看到stu1,stu2的析构调用,那么你应该这样:

void fun()
{
CStudent stu1(1,1),stu2(1,2);
stu1.display(stu2);
}


void main()
{
fun();
system("pause");
}

这样,两个对象的生命周期,只存在于fun函数内,你就可以看到两个对象的析构调用了



hongss 2018-06-27
  • 打赏
  • 举报
回复
引用 1 楼 dante100 的回复:
当对象结束其生命周期时,系统自动调用析构函数(例如对象所在的函数已调用完毕)
CStudent stu1(1,1),stu2(1,2); 仅仅是定义了对象stu1和stu2,对象生命周期并没有结束,所以系统不会自动调用析构函数。
stu1.display(stu2);对象所在的函数已经调用完毕,系统会自动调用析构函数。


qq_40272523 2018-06-27
  • 打赏
  • 举报
回复
只有当程序结束时,也就是在main函数结束前的一刻,才会自动调用析构函数,第二个图程序因为你手动要求调用stu2的析构函数了
水能zai舟 2017-04-07
  • 打赏
  • 举报
回复
谢谢啦
dante100 2017-04-02
  • 打赏
  • 举报
回复
当对象结束其生命周期时,系统自动调用析构函数(例如对象所在的函数已调用完毕) CStudent stu1(1,1),stu2(1,2); 仅仅是定义了对象stu1和stu2,对象生命周期并没有结束,所以系统不会自动调用析构函数。 stu1.display(stu2);对象所在的函数已经调用完毕,系统会自动调用析构函数。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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