完整代码:
#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”语句。
程序运行结果: