题目如下,求输出结果
class A { public: A() { cout<<"A"<<endl; } ~A() { cout<<"~A"<<endl; } }; class B:public A { public: B(A &a):_a(a) { cout<<"B"<<endl; } ~B() { cout<<"~B"<<endl; } private: A _a; }; int main(void) { A a; B b(a); return 0; }
这里先给出答案:
[root]$ ./class A A B ~B ~A ~A ~A
你可能会觉得奇怪,为什么少调了一次A的构造函数。其实这是由于使用初始化列表,初始化列表在初始化类的对象的时候,使用的是拷贝构造函数。
修改代码,增加拷贝构造函数的打印。
class A { public: A() { cout<<"A"<<endl; } ~A() { cout<<"~A"<<endl; } A(const A& a) {cout << "copy" << endl;} }; class B:public A { public: B(A &a):_a(a) { cout<<"B"<<endl; } ~B() { cout<<"~B"<<endl; } private: A _a; }; int main(void) { A a; B b(a); return 0; }
再看运行结果,这样构造和析构的次数就一致了。
[root]$ ./class A A copy B ~B ~A ~A ~A
时间: 2024-10-10 16:35:26