C++
构造函数出现异常时的行为
十一 14th
char *g_pszTest = NULL;class B{public:B(){cout << "B constructed" << endl;}~B(){cout << "B destructed" << endl;}};class C{public:C(){cout << "C constructed" << endl;}~C(){cout << "C destructed" << endl;}};class A : public B{public:A(){cout << "A constructed" << endl;g_pszTest = new char[20];strcpy(g_pszTest, "before throw");throw 1;strcpy(g_pszTest, "after throw");}~A(){cout << "A destructed" << endl;if (g_pszTest != NULL){cout << g_pszTest << endl;}}private:C m_c;};该段程序代码输出为:B constructedC constructedA constructedC destructedB destructedbefore throw1. 构造函数throw之后的代码不会被执行;2. throw了异常的类的析构函数不会被执行,但throw之前已经构造的对象的析构函数会被正常执行。
构造析构的顺序问题
十一 14th
#include using namespace std;class M{public:M(){cout << "M constructed" << endl;}~M(){cout << "M destructed" << endl;}};class N{public:N(){cout << "N constructed" << endl;}~N(){cout << "N destructed" << endl;}};class A : virtual public M{public:A(){cout << "A constructed" << endl;}~A(){cout << "A destructed" << endl;}};class B : virtual public M{public:B(){cout << "B constructed" << endl;}~B(){cout << "B destructed" << endl;}};class C : public B, public A{public:C(){cout << "C constructed" << endl;}~C(){cout << "C destructed" << endl;}private:N m_n;};int main(){// 构造的几点原则:// 1. 先构造父类,然后构造子类// 2. 虚拟继承,虚基类只会被构造一次// 3. 多重继承,写在前面的先被构造(class C : public B, public A,所以B先于A被构造)// 4. 先构造基类,然后构造成员对象(m_n)// 所以,这里将依次输出:// M constructed// B constructed// A constructed// N constructed// C constructedC c; // 析造的重要原则:析构的顺序与构造的顺序刚好相反!// 所以,这里将依次输出:// C destructed// N destructed// A destructed// B destructed// M destructedreturn 0;}
