关于构造函数一问?

maoxing63570 2010-07-23 05:02:35

#include <iostream>
using namespace std;
class Test
{
int x,y;
public:
Test(int val):y(val),x(y){}
int get_x()const
{
return x;
}
int get_y()const
{
return y;
}
};
void main ()
{
Test test(9);
cout<<test.get_x()<<" "<<test.get_y()<<endl;
}

上面是我写的一个测试代码,下面是c++ primer 4th edition 上的关于相关内容的描述
class X {
int i;
int j;
public:
// run-time error: i is initialized before j
X(int val): j(val), i(j) { }
};
In this case, the constructor initializer is written to make it appear as if j is initialized with val
and then j is used to initialize i . However, i is initialized first. The effect of this initializer is to
initialize i with the as yet uninitialized value of j !
=============================================================================================================
但是经过我的调试,初始化了的不是x,而是y(当然我想在说的是就我写的那个测试代码来说的),调试的结果跟书上说的那个貌似有点不一样了,知道是怎么回事的大牛们来解答!谢谢
...全文
67 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
maoxing63570 2010-07-23
  • 打赏
  • 举报
回复
呵呵,估计是头昏看错了,在这里向大家道歉,翻译的话,我觉得还可以过关吧,所以居然我可以从第一页就从英文看起,那么请大家相信这点翻译水平我还是有的。Thank you anyway.
zhangweiit 2010-07-23
  • 打赏
  • 举报
回复
这段的本意在于说明
构造函数初始化列表的初始顺序
同时,在赋值之前,要考虑到此值是否已经被初始化过,是否可以被赋值
zhangweiit 2010-07-23
  • 打赏
  • 举报
回复
In this case, the constructor initializer is written to make it appear as if j is initialized with val
and then j is used to initialize i . However, i is initialized first. The effect of this initializer is to
initialize i with the as yet uninitialized value of j !

翻译:
在这种情况下,构造函数的初始化列表看似要把val赋值给J,并把j赋给i.
但事实上,i先被初始化了,最终效果就是j的未初始化的值被赋给i
zhangweiit 2010-07-23
  • 打赏
  • 举报
回复
初始化了的不是x,而是y
这是正常的

他的过程是这样

X先被初始化,然后才是Y
在构造函数初始化列表的顺序是从右向左的

x,先被赋值,它的值是y,而这个时候,Y没被初始化,
所以,是一个不确定的值,由此可能会引发运行时错误

然后Y被赋值为val
yxqyrh 2010-07-23
  • 打赏
  • 举报
回复
你的测试结果明明和书上一样的啊
六级啊,那看文档应该没问题的
pengzhixi 2010-07-23
  • 打赏
  • 举报
回复
简单的说就是先声明的成员的初始化不能依赖后声明的成员
maoxing63570 2010-07-23
  • 打赏
  • 举报
回复
不好意思,对不起了,只恨英文水平还是太乱了,虽然是六级水平,哎,悲剧了
cattycat 2010-07-23
  • 打赏
  • 举报
回复
书上说的是虽然在构造函数初始化列表中j先出现,但先初始化的是i,开始j也没有初始化,所以i的值是没有初始化的j的值。而后j被初始化成val。

你可以改成下面这样试试。
Test(int val):y(val){x=y;}
pengzhixi 2010-07-23
  • 打赏
  • 举报
回复
你自己理解错误了。因为按照顺序x是先于y初始化的,书上的意思的x的初始化不能y。因为x在类声明里面是先声明的

64,637

社区成员

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

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