下面以例子说明参数为类对象,是否有初始化列表时构造与析构函数的执行顺序:#include <iostream>
using namespace std;
class
A {public: A(){ cout<<"A"<<endl; }
A(const
A& other){ cout<<"copy A"<<endl;}
~A() { cout<<"~A"<<endl; } };
class
B:public A
{ public: B(A a):_a(a)
// B(A &a):_a(a) 会有完全不同的结果 { cout<<"B"<<endl;
}
~B() { cout<<"~B"<<endl; }
private: A _a;
}; void
main(void)
{ A a;
B b(a);
return; } 运行结果:A A a;
//创建对象a执行A类的构造 copy A
//B b(a) 传参的时候利用A类的复制构造
A //创建对象B调用基类A的构造
copy A //使用初始化列表初始化成员_a利用A类的复制构造
B //调用自己的构造
~A //析构参数
~B //析构自身
~A //析构B类成员
~A //再析构基类的
~A //析构 对象aclass
A {public: A(){ cout<<"A"<<endl; }
A(const
A& other){ cout<<"copy A"<<endl;}
~A() { cout<<"~A"<<endl; } };
class
B:public A
{ public: B(A a)
//若此处换为:B(A &a),则不调用构造函数 { cout<<"B"<<endl;
}
~B() { cout<<"~B"<<endl; }
private: A _a;
}; void
main(void)
{ A a; B b(a); return; } 运行结果:A A a;
//创建对象a执行A类的构造 copy A
//B b(a) 传参的时候利用A类的复制构造
A //创建对象B调用基类A的构造
A //初始化B类的成员执行A类的构造
B //调用自己的构造
~A //析构参数
~B //析构自身
~A //析构B类成员
~A //再析构基类的
~A //析构 对象a

本文通过代码实例详细解释了在类对象中使用初始化列表时,构造函数和析构函数的执行顺序。展示了如何在继承关系中利用初始化列表进行成员变量的初始化,并分析了不同构造函数参数传递方式对构造过程的影响。

被折叠的 条评论
为什么被折叠?



