为什么结构内部的对象初始化不同?

Bar*_*ide 2 c++ struct initialization member-initialization c++11

我创建了一个类Point,这里是对应的hpp文件。

#ifndef POINT
#define POINT
class Point
{
 protected:
 int x;
 int y;
 public:
 Point(int x = 10, int y = 10);
 void movePoint(int moveX, int moveY);
 void printCoordinates();
};
#endif
Run Code Online (Sandbox Code Playgroud)

我注意到在 main 中,我可以声明一个对象并以这种方式初始化它:

Point myPoint(1, 1);
Run Code Online (Sandbox Code Playgroud)

如果我想创建一个包含两个点的结构,它不会让我以这种方式初始化它,相反,我必须使用大括号,这样:

struct segment
{
 Point point1 = {0, 0};
 Point point2 = {15, 15};
};
Run Code Online (Sandbox Code Playgroud)

这是为什么?

son*_*yao 6

因为默认成员初始化器(C++11 起)仅支持等号初始化器和花括号初始化器。

(强调我的)

通过默认成员初始化器,它是包含在成员声明中的大括号或等号初始化器,如果从构造函数的成员初始化器列表中省略该成员,则使用该初始化器。

这样你就可以

struct segment
{
 Point point1 = {0, 0};        // equal-sign initializer
 Point point2 = Point(15, 15); // equal-sign initializer
 Point point3 = Point{30, 30}; // equal-sign initializer
 Point point4 {45, 45};        // braced initializer
};
Run Code Online (Sandbox Code Playgroud)

Point myPoint(1, 1); 因为默认成员初始值设定项可能会导致函数声明的歧义问题。