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();
}
出力:
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 が 1 つしか呼び出されないのはなぜですか? 例外が参照によってキャッチされたとしても、一時的なものがまだ作成されていると思います。