C++对象初始化使用大括号(语法)

3
我刚刚看到了这行代码:

SDL_Color textColor = { 255, 0, 255 };

让我想到了为什么它可以像数组一样声明。我认为它可能只是意味着与textColor(255,0,255);相同,但是当我尝试创建自己的类时,它并不像那样工作。有人可以解释一下何时使用这种语法吗?参数去哪里了..?

3个回答

10

这是一种类型的聚合初始化,最有可能是一个简单的结构体或类。例如,

struct Foo 
{
  int i,j;
  double x,y;
};

int main()
{
  Foo f = {1,2, 3.,4.};
}

注意,由于关于structs的某些混淆,上面的示例也适用于class,在这种情况下,classstruct相同:

class Foo 
{
 public:
  int i,j;
  double x,y;
};

在C++11中,某些情况下将初始化类型的方法扩展到非聚合类型

例如:

std::vector<int> v = {1,2,3,4,5};

由于类聚合数据成员,那么一个类的对象是否可以以相同的方式初始化? - user1534664
@user1534664 如果它满足成为聚合体的条件,那么是可以的。在这个意义上,“struct”和“class”是相同的。 - juanchopanza
@user1534664 我添加了一些关于聚合类的词语。 - juanchopanza
谢谢,伙计!我现在理解这个概念了 :) - user1534664

3

所有聚合类型都可以使用大括号初始化,这会将每个聚合成员与匹配的项一起初始化。如果列表中的项比聚合成员少,剩余的元素将被初始化为空的大括号列表。


由于我在某些方面显然是错误的,因此删除了我的答案。从标准来看:聚合体是一个没有用户提供的构造函数(12.1),没有非静态数据成员的大括号或等号初始化程序(9.2),没有私有或受保护的非静态数据成员(第11条款),没有基类(第10条款)和没有虚函数(10.3)的数组或类(第9条款). 我认为你要表达的观点是,即使它可能是一个“结构体”,它仍然可能具有任何列出的特征,这些特征会防止它成为聚合体? - hmjd
聚合体在通常的非正式用法中是结构体。当然,你可以在技术上拥有类似结构体的“类”和类似类的“结构体”。但除了轻微的技术差异之外,我们通常选择“类”或“结构体”的内涵和原因也很重要。 - aschepler
@hmjd structclass在这方面是相同的。它们都可以是聚合体,也可以不是。我在我的答案中添加了一条注释。 - juanchopanza

1

SDL_Color 是一个聚合类型(在这种情况下是一个有4个成员的结构体)。

您可以使用初始化列表来初始化聚合类型(不仅限于数组)。

SDL_Color textColor = { 255, 0, 255 };

是相同的

SDL_Color textColor;
textColor.r = 255;
textColor.g = 0;
textColor.b = 255;
textColor.unused = 0;

我猜你的意思是三个成员,不是四个 :) - Kiril Kirov
@KirilKirov:实际上,它有4个成员。 - Mankarse
@KirilKirov:不,第四个是Uint8 unused - Andriy
啊,抱歉,我的错。我以为你是在一般性地说话。 - Kiril Kirov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接