一.普通类型生命周期
普通类型:
catch (MyException e)
class MyException {
public:
//有参构造
MyException() {
cout << "构造函数!" << endl;
}
//拷贝构造
MyException(const MyException& another) {
cout << "拷贝构造!" << endl;
}
~MyException() {
cout << "析构函数!" << endl;
}
};
void test() {
throw MyException();//调用构造函数
}
int main() {
try{
test();
}
catch (MyException e){//调用拷贝函数
cout << "异常捕获!" << endl;
//执行到此,执行析构
}
}
结果:程序在catch执行完成之后,调用析构函数。
二.引用类型生命周期
其他地方没有变化,只是将接受对象改为引用。如下:
catch (MyException& e)
结果:因为是引用类型,所以不会调用拷贝构造。
三.指针类型生命周期
修改两处地方。如下:
void test() {
MyException me;
throw &me;
}
int main() {
try{
test();
}
catch (MyException* e){
//执行到此,执行析构
cout << "异常捕获!" << endl;
}
}
结果:程序在执行“异常捕获!”之前,先执行析构函数。因此,不能调用类中的方法。
因为,类对象提前析构,我们不能调用类中函数,我们需要对函数做出修改。
正确方法:
1.申请空间。
2.释放空间。
如下:
void test() {
throw new MyException();申请空间
}
int main() {
try{
test();
}
catch (MyException* e){
cout << "异常捕获!" << endl;
delete e;释放空间
}
}
结果: