C++11:列表初始化如何在用户定义的对象中赋值?
C++11: how List-initialization assign values in a user defined object?
我有一个 class 图书馆,它包含来自另一个 class 书架的成员对象 shelf1。
Class 货架有几个变量,比如说:
class Shelf {
int height;
int width;
int materialType;
String shelfName;
}
现在在Library中,我想在Library声明中初始化成员对象shelf1:
Shelf shelf1{100, 200};
Shelf shelf2{100, "fiction"};
它们可以工作吗?列表初始化如何处理变量的顺序?
[更新]
这些代码是为了解释我的问题(我在现实世界中确实有类似的代码。但是放在这里太复杂了。所以我简化了我的问题)。
如果你的 class 是一个 aggregate,那么变量会根据你的 class 中声明的顺序进行初始化。为了让你的 class 成为一个聚合(并且能够使用这样的直接列表初始化),其中一个要求是所有成员都必须是 public
(感谢@Praetorian 抓住了这个),否则你的class 不是聚合,代码无法编译。
所以,假设成员是public
,
Shelf shelf1{100, 200};
用100
初始化height
,用200
初始化width
。
Shelf shelf2{100, "fiction"};
是编译时错误,因为第二个成员 width
不是 C 字符串。
更多详情here。
我有一个 class 图书馆,它包含来自另一个 class 书架的成员对象 shelf1。
Class 货架有几个变量,比如说:
class Shelf {
int height;
int width;
int materialType;
String shelfName;
}
现在在Library中,我想在Library声明中初始化成员对象shelf1:
Shelf shelf1{100, 200};
Shelf shelf2{100, "fiction"};
它们可以工作吗?列表初始化如何处理变量的顺序?
[更新] 这些代码是为了解释我的问题(我在现实世界中确实有类似的代码。但是放在这里太复杂了。所以我简化了我的问题)。
如果你的 class 是一个 aggregate,那么变量会根据你的 class 中声明的顺序进行初始化。为了让你的 class 成为一个聚合(并且能够使用这样的直接列表初始化),其中一个要求是所有成员都必须是 public
(感谢@Praetorian 抓住了这个),否则你的class 不是聚合,代码无法编译。
所以,假设成员是public
,
Shelf shelf1{100, 200};
用100
初始化height
,用200
初始化width
。
Shelf shelf2{100, "fiction"};
是编译时错误,因为第二个成员 width
不是 C 字符串。
更多详情here。