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

有如下程序:#include<iostream>usingnamespacestd;classPart{public:Part(intx=0):val(x){cout<<... 有如下程序:
#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
展开
 我来答
百度网友3bbb394316
2013-12-21 · 超过17用户采纳过TA的回答
知道答主
回答量:65
采纳率:0%
帮助的人:45.5万
展开全部
首先你要清楚的是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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式