如果我只需要初始化C ++结构的几个选择值,这是否正确:
struct foo {
foo() : a(true), b(true) {}
bool a;
bool b;
bool c;
} bar;
我是否正确地假设我最终会得到一个struct名为bar元素的项bar.a = true,bar.b = true而未定义项bar.c呢?
如果我只需要初始化C ++结构的几个选择值,这是否正确:
struct foo {
foo() : a(true), b(true) {}
bool a;
bool b;
bool c;
} bar;
我是否正确地假设我最终会得到一个struct名为bar元素的项bar.a = true,bar.b = true而未定义项bar.c呢?
bar是变量。
typedef struct foo {} bar;。
bar是该结构,那是foo什么?这与定义foo结构并分别将新变量声明bar为类型foo是否相同?
struct foo {//something}; foo bar;
Answers:
是。bar.a并且bar.b设置为true,但bar.c未定义。但是,某些编译器会将其设置为false。
在此处查看实时示例:struct demo
根据C ++标准8.5.12节:
如果不执行初始化,则具有自动或动态存储持续时间的对象的值不确定
对于原始的内置数据类型(bool,char,wchar_t,short,int,long,float,double,long double),如果未明确初始化,则仅全局变量(所有静态存储变量)的默认值为零。
如果您真的不希望undefinedbar.c开头,则还应该像对bar.aand一样进行初始化bar.b。
您甚至不需要定义构造函数
struct foo {
bool a = true;
bool b = true;
bool c;
} bar;
需要说明的是:这些被称为大括号或相等初始化器(因为您也可以使用大括号初始化而不是等号)。这不仅适用于集合:您可以在普通的类定义中使用它。这是在C ++ 11中添加的。
c++标记表示C ++ 11。如果人们想讨论旧版本,欢迎他们说C ++ 98或C ++ 03。明年的某个时候,裸c++标签将再次更改为C ++ 14。
std::is_pod<T>::value变为非POD(通过验证),因此,从某种意义上讲,这等同于编写一个在初始化列表中设置相同值的非默认构造函数。
您可以通过使用构造函数来做到这一点,如下所示:
struct Date
{
int day;
int month;
int year;
Date()
{
day=0;
month=0;
year=0;
}
};
或像这样:
struct Date
{
int day;
int month;
int year;
Date():day(0),
month(0),
year(0){}
};
在您的情况下,bar.c是未定义的,其值取决于编译器(而a和b设置为true)。
ints成员是必须满足琐碎定义的自定义类(例如,没有非默认构造函数),那将是在主体中分配而不是在init列表中进行构造的原因。但是,在这种情况下有用的场景数量可能很少,因此init列表绝对应该是默认建议-很少有例外,它们经过仔细限定和证明是合理的,与此处不同。
defaultctor不合适且标准布局排除非default构造函数的成员对象,必须以另一种方式执行“初始化”,operator=无论是初始化函数还是其他函数。在父代的构造函数中进行此“初始化”是有意义的,即在其主体中进行赋值。operator=这相当于帖子中的原语的体内分配。过度思考或切线,也许是正确的;-)