为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不能在Line.cpp中加入下面的语句,只能使用老师的列表初始化吗?

老师在Line.cpp是使用了列表初始化:Line::Line(int x1,int y1,int x2,int y2):pointA(x1,y1),pointB(x2, y2)//使用列表初始化


我打算在这个函数里面加上

pointA.SetX(x1);

pointA.SetY(y1);

pointB.SetX(x2);

pointB.SetY(y2);

而不用列表初始化,却提示出错http://img1.sycdn.imooc.com//59b3f9c0000154a119201039.jpg

是只能用列表初始化吗?我其他文件和老师写法一样。

正在回答

2 回答

实例化对象时构造函数执行的先后顺序是先对象成员(即坐标类)再Line类,当坐标类的构造函数有参数时,必须对Line类的构造函数进行初始化列表,因为初始化列表是先于构造函数执行的,这样才能保证实例化坐标类的对象成员时,其构造函数有参数可用。如果按照你写的这种方法,只需要把坐标类的构造函数设为无参即可。

0 回复 有任何疑惑可以回复我~

在无参数、默认构造函数下,实例化对象时构造函数执行的先后顺序是先对象成员再Line类的;而对构造函数赋值的先后顺序而言是,先执行初始化列表再其他。

像您书写pointA.SetX(x1);等的位置可以看出,Coordinate还没有实例化呢,怎么可以直接调用其内部函数.SetX呢.

我是这么感觉的,多交流


1 回复 有任何疑惑可以回复我~
#1

菓子 提问者

①.是说初始化列表的作用是将Coordinate实例化吗?我把下面的SetA函数和SetB函数都去掉了,保留Line的构造函数的列表初始化,再把pointA.SetX(x1);pointA.SetY(y1);pointB.SetX(x2);pointB.SetY(y2);给加进去,得到的结果和修改之前的结果相同。 ②.我在Line.h文件里面写了个:Coordinate pointA;Coordinate pointB; 这个是实例化吗?
2017-09-10 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之封装篇(下)
  • 参与学习       70919    人
  • 解答问题       514    个

封装--面向对象三大特征之一,通过案例让C++所学知识融会贯通

进入课程

为什么不能在Line.cpp中加入下面的语句,只能使用老师的列表初始化吗?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信