try-catch函数与构造、析构函数的关系

本文详细分析了C++程序中try-catch块如何与构造函数和析构函数配合工作。在函数fun()中,创建了两个student类型的对象stu1和stu2。stu1在get_data()函数中遇到条件判断触发异常,执行catch块并通过析构函数处理对象。stu2在初始化时抛出异常,执行相应的catch块,并在析构过程中完成资源释放。整个流程清晰地展示了异常处理与对象生命周期的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整代码:

#include<iostream>
#include<cstring>
using namespace std;
class student
{
	public:
		student(int n,string nam);
		~student();
		void get_data();
	private:
		int num;
		string name;
};
student::student(int n,string nam)
{
	cout<<"constructoe-"<<n<<endl;
	num=n;
	name=nam;
}
student::~student()
{
	cout<<"destructor-"<<num<<endl;
}
void student::get_data()
{
	if(num==0)
		throw num;
	else
		cout<<num<<" "<<name<<endl;
	cout<<"in get_data()"<<endl;
}
void fun()
{
	student stu1(1101,"tan");
	stu1.get_data();
	try
	{
		student stu2(0,"Li");
		stu2.get_data();
	}
	catch(int n)
	{
		cout<<"num="<<n<<",error!"<<endl;
	}
}
int main()
{
	cout<<"main begin"<<endl;
	cout<<"call fun()"<<endl;
	fun();
	cout<<"main end"<<endl;
	return 0;
}

程序分析:

1.程序先从主函数中语句“main begin”开始,再执行“call fun()”。

2.而后流程进入fun()函数:

        (1)在fun()函数中建立student类型的stu1并建立构造函数,执行构造函数中的语句,而后程序返回至fun()函数中,执行su1.get_data()语句。在su1.get_data()函数中,因为num=1101,因此执行if-else语句中的else部分,最后执行“in get_data()”。

        (2)然后程序再返后至fun()函数中,执行try检查语句,建立一个student类型的stu2类,并建立构造函数、赋予初值。然后程序返回至try语句中,执行“stu2.get_data()”语句。在stu2.get_data()函数中,因为此时的num被赋予初值为0,因此执行if-else语句的if部分,throw关键字抛出错误信息num,然后流程跳转至对应的catch抓捕函数,因为stu2中throw抛出的错误信息num已经传递到catch定义的int型n,stu2执行结束,开始调用stu2的析构函数,然后再执行catch函数的cout语句。再执行stu1的析构函数。最后流程从fun()函数中出来,回到主函数中。

3.执行主函数中最后的“main end”语句。


程序运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值