1. 程式人生 > >C++建構函式中丟擲異常

C++建構函式中丟擲異常

建構函式中丟擲異常會有怎樣的影響呢?如下實驗程式碼

#include <iostream>
#include <stdexcept>
using namespace std;
class A
{
  public:
    A(int n){}
  ~A(){cout<<"A destroy"<<endl;}
};

class B
{
  public:
    B(int n):a(n)
    {
      throw runtime_error("error");
    }
  private:
    A a;
};

int main()
{
  try{
  B b(3);
  }
  catch(...)
  {
    cout << "catch" << endl;
  }

  return 0;
}

輸出:

在catch異常前,呼叫了A的解構函式。

事實上:當建構函式發生異常時,如果已經初始化了成員物件,則會呼叫成員物件的解構函式。但發生異常的建構函式自己本身的物件不會呼叫解構函式。即在上述程式碼中B的建構函式發生異常,呼叫A的析構,不會呼叫B的析構。