一道C++题目,求详细解析

有如下程序:
#include<iostream>
using namespace std;
class Part{
public:
Part(int x=0):val(x){cout<<val;}
~Part(){cout<<val;}
private:
int val;
};
class Whole{
public:
Whole(int x,int y,intz=0):p2(x),p1(y),val(z){cout<<val;}
~Whole(){cout<<val;}
private:
Part p1,p2;
int val;
};
int main(){
Whole obj(1,2,3);
return 0;
}
程序输出的结果是(B)。
A.123321
B.213312
C.213
D.1231213

首先你要清楚的是2个顺序,一个是初始化列表的顺序,另一个是构造和析构的顺序的关系:
初始化列表的初始化顺序是按照声明的顺序来初始化的

class Cat{
float x, y;
Cat(int a1, int a2): x(a1), y(a2){} //毫无疑问,先将x赋值为a1,y赋值为a2

Cat(float a1, float a2):y(a1), x(a2){}
//初始化的顺序按声明的顺序,与列表初始顺序无关,所以先将x赋值为a2,y赋值a1
}

而我们知道初始化列表的初始化是调用构造函数初始化的
由于声明顺序是p1,p2,val. 所以 Whole obj(1,2,3)
会先执行p1的构造函数 所以先输出2再输出13
析构函数和构造函数调用顺序正好相反,就像一个栈,先构造后析构,所以先213 后 312
温馨提示:答案为网友推荐,仅供参考