什么是指定初始化器?
What is a Designated Initializer?
我想了解指定初始化程序提供的与直接初始化不同的内容。
例如:
#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;
}
这两条线怎么去皮呢?对于细致的,有什么区别?
这两行在语义上是等价的。两者之一更明确,可以减少软件错误。
那一行:
Subject subject_d{.x = 1, .y = 2, .z= 3};
如果您重命名至少一个字段或更改它们的顺序,它将不再编译,因此该表格为 'secure'
但是
Subject subject_c{1, 2, 3};
不假设字段的名称,所以如果你交换它们的顺序,每个字段的初始化将不相同但默默地
在您发布的示例中,在行为方面绝对没有区别。聚合被初始化为保存相同的三个值。就可读性而言,可以提出一个论点,即指定的初始化程序版本在发生的事情方面更加明确。它也可以用于服务于文档目的。每个初始化器的预期含义(假设我们很好地命名了成员)就写在它旁边。
在初始化中超出了明确性。指定的初始值设定项还可以很好地与其他 C++ 功能配合使用。考虑一下。
struct Subject{
int x = 0;
int y = 0;
int z = 0;
};
你可以写
Subject const s { .y = 2 };
我们对除 y
之外的所有字段使用默认值。而变量 s
是常量,因为我们不希望它改变。它在 const 正确性方面很好。
你可以在没有指定初始化器的情况下实现类似的效果,但如果我们希望 s
保持常量,它会涉及更多样板,并且可以说不会那么简洁明了。简而言之-shell 为什么他们很高兴用这种语言。
我想了解指定初始化程序提供的与直接初始化不同的内容。
例如:
#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;
}
这两条线怎么去皮呢?对于细致的,有什么区别?
这两行在语义上是等价的。两者之一更明确,可以减少软件错误。
那一行:
Subject subject_d{.x = 1, .y = 2, .z= 3};
如果您重命名至少一个字段或更改它们的顺序,它将不再编译,因此该表格为 'secure'
但是
Subject subject_c{1, 2, 3};
不假设字段的名称,所以如果你交换它们的顺序,每个字段的初始化将不相同但默默地
在您发布的示例中,在行为方面绝对没有区别。聚合被初始化为保存相同的三个值。就可读性而言,可以提出一个论点,即指定的初始化程序版本在发生的事情方面更加明确。它也可以用于服务于文档目的。每个初始化器的预期含义(假设我们很好地命名了成员)就写在它旁边。
在初始化中超出了明确性。指定的初始值设定项还可以很好地与其他 C++ 功能配合使用。考虑一下。
struct Subject{
int x = 0;
int y = 0;
int z = 0;
};
你可以写
Subject const s { .y = 2 };
我们对除 y
之外的所有字段使用默认值。而变量 s
是常量,因为我们不希望它改变。它在 const 正确性方面很好。
你可以在没有指定初始化器的情况下实现类似的效果,但如果我们希望 s
保持常量,它会涉及更多样板,并且可以说不会那么简洁明了。简而言之-shell 为什么他们很高兴用这种语言。