在单继承的情况下,父类构造先于子类,子类析构先于父类,例:
class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; class B : public A { public: B() { cout << "B" << endl; } ~B() { cout << "~B" << endl; } };
结果为:
A B ~B ~A
在多继承的情况下,此时的构造顺序在满足单继承构造顺序要求的情况下,出现了两个同级父类的构造顺序问题。在这个时候,对于同级父类,构造顺序是根据继承列表从左往右的。析构顺序相反。
class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; class B{ public: B() { cout << "B" << endl; } ~B() { cout << "~B" << endl; } }; class C : public B, public A { public: C() { cout << "C" << endl; } ~C() { cout << "~C" << endl; } };
输出:
B A C ~C ~A ~B
类中包含类对象的情况下的构造顺序:
class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; class B : public A { public: B() { cout << "B" << endl; } ~B() { cout << "~B" << endl; } }; class C : public B, public A { public: C() { cout << "C" << endl; } ~C() { cout << "~C" << endl; } }; class D : public B { public: D() { cout << "D" << endl; } ~D() { cout << "~D" << endl; } private: C c; A a; };
输出结果为:
A // D 继承 B,B 继承 A,所以顺序为 A, B B A // 定义 C 的对象,C 继承顺序中第一个是 B,B 继承 A,所以是 A, B B A // C 继承顺序中的第二个 C // C 的定义 A // D 中参数 A D ~D ~A ~C ~A ~B ~A ~B ~A
类内声明:
class D { public: D(int a) { cout << "D: " << a << endl; } }; class M { public: M() { cout << ‘M‘ << endl; extern D d; } };
上面的写法不报错,因为没有进行对象的定义,只有对象的声明。所以不需要调用D的构造函数。
包含 static 变量:
class M { public: M() { cout << ‘M‘ << endl; } private: static D d; };
在不进行 static 对象的定义的情况下,进行 M 对象的定义是不报错的,因为没有用到 D 类的构造函数。也即是 d 只进行了声明没有进行定义。
多区段下构造成员顺序:
class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; class B{ public: B() { cout << "B" << endl; } ~B() { cout << "~B" << endl; } }; class D { private: A a; B b; public: D() { cout << "D" << endl; } ~D() { cout << "~D" << endl; } private: B b2; A a2; };
输出结果:
A B B A D ~D ~A ~B ~B ~A
就像上述代码,不管交换访问区还是访问权限,始终都是按照从上到下的顺序进行构造.
时间: 2024-10-24 05:59:17