C++构造函数、析构函数顺序

    xiaoxiao2021-03-25  62

    1、输入以下程序,分析运行结果。

    #include <iostream> using namespace std; class B1 { public: B1(int i) { b1 = i; cout<<"构造函数 B1."<<b1<<endl; } void print() { cout<<b1<<endl; } private: int b1; }; class B2 { public: B2(int i) { b2 = i; cout<<"构造函数 B2."<<b2<<endl; } void print() { cout<<b2<<endl;} private: int b2; }; class B3 { public: B3(int i) { b3 = i; cout<<"构造函数 B3."<<b3<<endl; } int getb3() { return b3; } private: int b3; }; class A : public B2, public B1 { public: A(int i, int j, int k, int l):B1(i), B2(j), bb(k) { a = l; cout<<"构造函数 A."<<a<<endl; } void print() { B1::print(); B2::print(); cout<<a<<endl;} private: int a; B3 bb; }; void main() { A aa(1, 2, 3, 4); aa.print(); }

    2、修改上面的4个类,添加析构函数,在析构函数中输出各私有数据成员的值。并分析结果。

    #include <iostream> using namespace std; class B1 { public: B1(int i) { b1 = i; cout<<"构造函数 B1."<<b1<<endl; } ~B1(){ cout<<"析构函数 B1."<<b1<<endl; } void print() { cout<<b1<<endl; } private: int b1; }; class B2 { public: B2(int i) { b2 = i; cout<<"构造函数 B2."<<b2<<endl; } void print() { cout<<b2<<endl;} ~B2(){ cout<<"析构函数 B2."<<b2<<endl; } private: int b2; }; class B3 { public: B3(int i) { b3 = i; cout<<"构造函数 B3."<<b3<<endl; } int getb3() { return b3; } ~B3(){ cout<<"析构函数 B3."<<b3<<endl; } private: int b3; }; class A : public B2, public B1 { public: A(int i, int j, int k, int l):B1(i), B2(j), bb(k) { a = l; cout<<"构造函数 A."<<a<<endl; } ~A(){ cout<<"析构函数 A."<<a<<endl; } void print() { B1::print(); B2::print(); cout<<a<<endl;} private: int a; B3 bb; }; int main() { A aa(1, 2, 3, 4); aa.print(); return 0; }

    实验分析以及心得体会:主要是类的多继承性,在继承了多个基类之后,派生类对象调用的构造函数和析构函数的顺序,以及在派生关系中同名函数的隐藏关系,根据实验结果可以发现派生类对象在调用构造函数遵循的定律是首先调用基类的构造函数,其次是调用对象的构造函数,最后才是调用自身的构造函数,关于派生对象中定义了同名函数的问题,直接用派生对象调用该同名函数是,基类的该函数被隐藏,如果要调用则要使用基类的名调用。在加入析构函数之后可以发现,析构函数的调用顺序刚好和构造函数的调用顺序相反先是自身析构函数,其次是对象的析构函数,最后才是基类。

    转载请注明原文地址: https://ju.6miu.com/read-15722.html

    最新回复(0)