下面以例子说明参数为类对象,是否有初始化列表时构造与析构函数的执行顺序:
#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
//析构 对象a
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)
//若此处换为: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