为什么这里的 A::x 是 10,而不是 5 呢?

我有明珠一颗 2020-04-14 04:31:51
这是一道读程序写结果题目,不必去关注它的格式等问题,主要是这个输出结果,我一点也不明白,我觉得应该是5呀
#include<iostream>
using namespace std;
class A
{
public:
int x;
A(int i=10)
{
x=i;
cout<<"A:"<<x<<endl;
}
};
class B:public A
{
A a;
int x2;
public:
B(int i):a(i)
{
x2=i;
// 为什么这里的 A::x 是 10,而不是 5 呢?
cout<<"B:"<<x2<<", "<<A::x<<", "<<a.x<<endl;
}
};
int main()
{
B b(5);
return 0;
}
...全文
141 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
我有明珠一颗 2020-04-15
  • 打赏
  • 举报
回复
谢谢诸位,我懂了
千梦一生 2020-04-15
  • 打赏
  • 举报
回复
我靠,为了看懂这个去学习了一下初始化参数列表。

回来分析了半天发现,这东西没注意容易绕进去。

B(int i):a(i) 这里好像是在初始化成员变量 a = i;//相当于隐式调用类A的A(int i=10)构造函数来初始化a 【a = A(i);】

也就是说楼主想要的5。在a.x中。

即:这里进入构造函数打印之前有三个x
分别是:

this.x2 = 5
A::x = 10 //调用的默认构造函数,那位老师也讲过了。需得显示调用才行
a.x = 5

我想应该是这样了

ggglivw 2020-04-14
  • 打赏
  • 举报
回复
写错,是没有把5赋值,用的默认10
ggglivw 2020-04-14
  • 打赏
  • 举报
回复
你又没有给B继承的基类构造赋10. i赋值的变量是B成员而已。
寻开心 2020-04-14
  • 打赏
  • 举报
回复
B的构造函数调用的还是默认的A的构造函数来实现的, 并不是B(i)就调用A(i)的关系 public: B(int i):A(i),a(i) 这样就可以了
棉猴 2020-04-14
  • 打赏
  • 举报
回复
因为在B的构造函数中并没有显式调用A的构造函数,所以这时会调用A的默认参数的构造函数,即此时A::x的值是10,如果把B的构造函数写成
	B(int i) :A(i), a(i)//--------显式调用A的构造函数,此时A的构造函数不再是默认参数,而是i------------
	{
		x2 = i;
		// 此时A::x的值是5
		cout << "B:" << x2 << ", " << A::x << ", " << a.x << endl;
	}
VS2015 调试如下

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧