下⾯程序的运⾏结果是什么(D)
A.输出1 1
B.输出2 2
C.编译报错
D.输出1 随机值
E.输出1 2
F.输出 2 1
#include<iostream>
using namespace std;
class A
{
public:
A(int a)
:_a1(a)
, _a2(_a1)
{}
void Print()
{
cout <<_a1 <<" " <<_a2<< endl;
}
private:
int _a2 = 2; //声明
int _a1 = 2;
};
int main()
{
A aa(1);
aa.Print();
}
分析:首先拿1调用构造函数A(int a)直接初始化aa,初始化aa时,由于是初始化列表,初始化顺序是看声明顺序,先声明的先初始化, _a2先被声明,那么先初始化_a2,拿此时aa对象中还未被初始化的_a1随机值去初始化_a2,接着拿a的值1去初始化_a1。注意,与构造函数相比,构造函数的初始化顺序是先定义的先初始化