class Error1
{
public:
int errorcode;
Error1(int x):errorcode(x){ cout<<"CTOR Error1"<<endl; }
//Error1(Error1& obj){
// errorcode = obj.errorcode;
// cout<<"CopyCTOR Error1"<<endl;
//}
~Error1(){cout<<"DTOR Error1"<<endl; }
};
void fun()
{
cout<<"Inside fun"<<endl;
throw(Error1(5));
}
int main()
{
try{
fun();
}
catch(Error1& eobj)
{
cout<<"Error1 type occured with code:"<<eobj.errorcode<<endl;
}
cin.get();
}
OUTPUT:通过引用捕获异常时临时对象不会创建?
Inside fun
CTOR Error1
DTOR Error1
Error1 type occured with code:5
DTOR Error1
此输出指示一个ERROR1对象是catch处理构造副本。由于复制构造函数没有为Error1对象定义,所以使用默认拷贝构造函数。
当我取消注释评论部分定义复制构造函数我得到以下输出。
Inside fun
CTOR Error1
Error1 type occured with code:5
DTOR Error1
为什么只有一个DTOR被调用?即使异常被引用引用,我相信仍然会创建一个临时对象。
看起来输出依赖于编译器和异常运行时实现。例如,gcc 4.3.4不会为您的第一个代码示例使用默认的复制构造函数生成任何临时对象。你可以在这里看到一个例子:http://ideone.com/9QyLf – Jason 2012-07-07 06:26:59
首先,如果你定义你的DTOR为虚拟的,你将得到与第二个相同的第一个行为。 – klement 2012-07-07 06:28:15
@klement:这里没有多态行为发生,所以我相信使用'virtual' DTOR是不必要的 – Jason 2012-07-07 06:29:30