为什么我们不能初始化结构中的成员?
例:
struct s { int i = 10; };
Alex B.. 38
如果要在声明中初始化非静态成员:struct
在C++(而不是C)中,structs
几乎与类同义,并且可以在构造函数中初始化成员.
struct s { int i; s(): i(10) { } };
如果要初始化实例:
在C或C++中:
struct s { int i; }; ... struct s s_instance = { 10 };
C99还有一个称为指定初始化器的功能:
struct s { int i; }; ... struct s s_instance = { .i = 10, };
还有一个GNU C扩展,它与C99指定的初始化器非常相似,但最好使用更便携的东西:
struct s s_instance = { i: 10, };
Jonathan Lef.. 34
直接的答案是因为结构定义声明了一个类型而不是一个可以初始化的变量.你的例子是:
struct s { int i=10; };
这不会声明任何变量 - 它定义了一个类型.要声明一个变量,你可以在}
和之间添加一个名称;
,然后你会在之后初始化它:
struct s { int i; } t = { 10 };
正如Checkers所说,在C99中,你也可以使用指定的初始化器(这是一个很好的改进 - 有一天,C将赶上Fortran 66用于数据初始化的其他功能,主要是重复初始化器的次数).有了这种简单的结构,就没有任何好处.如果你有一个结构,比如20个成员,并且只需要初始化其中一个(比如因为你有一个标志表明结构的其余部分已经或者没有被初始化),它更有用:
struct s { int i; } t = { .i = 10 };
此表示法还可用于初始化联合,以选择初始化联合的哪个元素.
如果要在声明中初始化非静态成员:struct
在C++(而不是C)中,structs
几乎与类同义,并且可以在构造函数中初始化成员.
struct s { int i; s(): i(10) { } };
如果要初始化实例:
在C或C++中:
struct s { int i; }; ... struct s s_instance = { 10 };
C99还有一个称为指定初始化器的功能:
struct s { int i; }; ... struct s s_instance = { .i = 10, };
还有一个GNU C扩展,它与C99指定的初始化器非常相似,但最好使用更便携的东西:
struct s s_instance = { i: 10, };
直接的答案是因为结构定义声明了一个类型而不是一个可以初始化的变量.你的例子是:
struct s { int i=10; };
这不会声明任何变量 - 它定义了一个类型.要声明一个变量,你可以在}
和之间添加一个名称;
,然后你会在之后初始化它:
struct s { int i; } t = { 10 };
正如Checkers所说,在C99中,你也可以使用指定的初始化器(这是一个很好的改进 - 有一天,C将赶上Fortran 66用于数据初始化的其他功能,主要是重复初始化器的次数).有了这种简单的结构,就没有任何好处.如果你有一个结构,比如20个成员,并且只需要初始化其中一个(比如因为你有一个标志表明结构的其余部分已经或者没有被初始化),它更有用:
struct s { int i; } t = { .i = 10 };
此表示法还可用于初始化联合,以选择初始化联合的哪个元素.
请注意,在C++ 11中,现在允许以下声明:
struct s { int i = 10; };
这是一个古老的问题,但它在谷歌中排名靠前,并且可能会澄清.
编辑:这个问题最初被标记了,c++
但是海报说它是关于c
所以我重新标记了这个问题,我现在离开了答案......
在C++中,a struct
只是一个class
默认值public
而不是private
成员和继承.
C++只允许static const
整数成员内联初始化,其他成员必须在构造函数中初始化,或者如果它struct
是初始化列表中的POD(当声明变量时).
struct bad { static int answer = 42; // Error! not const const char* question = "what is life?"; // Error! not const or integral }; struct good { static const int answer = 42; // OK const char* question; good() : question("what is life?") // initialization list { } }; struct pod { // plain old data int answer; const char* question; }; pod p = { 42, "what is life?" };