提问者:小点点

什么是指定的初始值设定项?


我想知道指定的初始化器与直接初始化有什么不同

让这个例子:

#include <iostream>

struct Subject{

    int x;
    int y;
    int z;

};

int main()
{ 
    Subject subject_d{.x = 1, .y = 2, .z= 3};
    Subject subject_c{1, 2, 3};

    return 0;
}

如何才能把这两条线去皮呢? 对于一丝不苟的,又有什么区别呢?


共3个答案

匿名用户

在您发布的示例中,在行为方面完全没有区别。 聚合被初始化为保存相同的三个值。 在可读性方面,可以提出一个论点,即指定的初始值设定项版本在所发生的事情方面更加明确。 它也可以用来提供文档。 每个初始值设定项的预期含义(假设我们对成员进行了正确的命名)就写在它的旁边。

在初始化中超越显式。 指定的初始值设定项还可以很好地配合其他C++特性。 而是考虑一下。

struct Subject{
    int x = 0;
    int y = 0;
    int z = 0;
};

你可以写

Subject const s { .y = 2 };

y外,所有字段都使用默认值。 变量s是常量,因为我们不希望它改变。 就常量正确性而言,它是很好的。

您可以在没有指定初始值设定项的情况下实现类似的效果,但是如果我们想要s保持常量,这将涉及到一个公平的更多的锅炉灶,并且可能不会那么简洁和清晰。 这就是为什么他们在语言中很好的原因。

匿名用户

那一行:

Subject subject_d{.x = 1, .y = 2, .z= 3};

如果至少重命名一个字段或更改它们的顺序,它将不再编译,因此该表单是“安全的”。

但是

Subject subject_c{1, 2, 3};

不假设字段的名称,因此如果您交换它们的顺序,每个字段的初始化将不相同,而是无声地

匿名用户

这两行在语义上是等价的。 两者中的一个更加明确,可以导致更少的软件错误。