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