关于c ++中的struct初始化

时间:2011-04-27 07:04:01

标签: c++ struct

我有像这样的结构

 typedef struct sample
 {
       double x,
       double y,
       double z
 }s1;
 s1 s;

是否会初始化s变量中的内容?

x,y,z的值是什么?

感谢

4 个答案:

答案 0 :(得分:9)

如果在函数范围中定义x,则不会初始化

yzs。它们将包含一些未指定的值。在文件范围内,数据成员将初始化为其默认值。

在C ++中,您可以使用构造函数初始值设定项列表来初始化数据成员

例如

struct ABC
{
   int x;
   int y;

   ABC(): x(1),y(2){}
};

ABC s; // x and y initialized to 1 and 2 respectively

在C ++中,您还有default initialization and value initialization来初始化数据成员。

答案 1 :(得分:4)

在您提供的代码中,字段将是未初始化的。你可以添加一个构造函数(如果你需要/可以),或者如果你需要POD-ness(代码的某些部分取决于其中一些属性)并且你不能添加构造函数,你仍然可以 value-在使用地点初始化结构(即将每个成员设置为0):

struct sample        // typedef not required
{
   double x,
   double y,
   double z
};
sample s = sample(); // will set all members to 0.0

现在,如果要使用某些特定值初始化不同的成员,因为它是一个聚合,您可以使用聚合初始化:

sample s = { 1.0, 3.0 };

这会将x设置为1.0,将y设置为3.0。由于z没有值,编译器会将其设置为0.0。请注意,这意味着sample s = {};等同于sample s = sample();

答案 2 :(得分:2)

如果是C ++,你可以创建构造函数。

struct s1
{
  s1( const double x = 0.0, const double y = 0.0, const double z = 0.0 )
  : x(x), y(y), z(z)
  {
  };
  double x;
  double y;
  double z;
};

s1 s;

答案 3 :(得分:1)

如果变量为doubleint /文件范围,则会初始化staticnamespace等内置类型,否则 - 出于效率原因 - 它们是除非构造函数表明它有用,否则不会初始化。

注意:这个答案解决了“s1 s”;你描述的情况。在定义变量时可以提供显式初始化,但这是另一种情况。

添加构造函数:

struct X
{
    X() : x_(0), y_(0), z_(0) { }
    double x, y, z;
};