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

c++对象成员问题:为什么在Line.h中实例化不需要传入参数

/ 猿问

c++对象成员问题:为什么在Line.h中实例化不需要传入参数

C++
韦德之道Chen 2019-08-31 10:29:27

https://img3.mukewang.com/5d69d22f000132dd07480702.jpg

https://img2.mukewang.com/5d69d22f000112f207700615.jpg

想问下,在Line.h中,

Coordinate m_coorA;

Coordinate m_coorB;

这两行代码是类的成员变量,同时也是将Coordinate类中的两个对象实例化了对吧。那么Coordinate的构造函数如图一写成了

Coordinate::Coordinate(int x,int y)

{

m_iX=x;

m_iY=y;

cout<<"did it"<<endl;

}

这是有参数的构造函数,那不是矛盾了吗?构造函数有参数,对应的对象实例化的时候却是没有参数的


查看完整描述

1 回答

?
onemoo

你的问题“这两行代码是类的成员变量,同时也是将Coordinate类中的两个对象实例化了对吧”

不一定。


第二张图是 Line 的类声明,其中你画圈的代码是对其成员变量的描述。

像这样的非 static 成员变量的实例化代码,要么出现在 Line 构造函数的成员初始化列表中,如:

// 构造函数参数列表后面冒号后的部分就是“成员初始化列表”
// 成员变量的初始化推荐放在这里
Line(int x1, int y1, int x2, int y2) : m_coorA(x1, y1), m_coorB(x2, y2) { ... }

要么,在 C++11 标准之后,也可以在类中(你画圈的地方)提供初值,必须用等于号或者大括号的初始化形式,如:

class Line {
...
private:
    Coordinate m_coorA{ ... };  // C++11之后,你可以在这里用大括号形式调用构造函数
...
};

在类实例化时,成员变量可通过以上两种方式进行实例化。如果都没有提供,成员变量会被默认构造。

鉴于你说没有编译失败,虽然你没有提供构造函数的实现代码,推测是使用了成员初始化列表的方式进行了成员的初始化。

查看完整回答
反对 回复 2019-09-07

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信