2011-04-27 39 views
3

结构初始化我有类似结构这些关于C++

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

将以秒变量的初始化内容还是不?

x,y,z的值是多少?如果s是在功能范围内定义

感谢

+3

需要注意的是,在C++中,你不会经常看到'typedef结构富{...'。这是因为在C++中,与C不同,所有结构名称也都是类型名称。在C++中,你可以写:'struct sample {};样本s;'。 – 2011-04-27 16:39:27

回答

9

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

在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初始化数据成员。

+2

在C++中,“不会被初始化”是错误的。这取决于。 – 2011-04-27 07:10:59

+0

@Jan:是的,它取决于对象是在函数范围还是在文件范围 – 2011-04-27 07:13:31

+0

处定义。但是,如果在全局范围声明's',将不会使用零初始化x和y? – 2011-04-27 07:14:05

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; 
+0

但是,您不必制作构造函数,仍然可以将它们初始化为零。 – 2011-04-27 07:11:24

+0

你应该使构造函数为'explicit',任何可以用一个参数调用的构造函数都容易打开系统进行不必要的转换:'void foo(s1 const &); foo(x);'如果'x'是算术类型,该代码可能是一个错误,但实际上通过将'x'转换为's1'作为's1(x)',然后调用'foo'来实现。通常使构造函数更加明确,并且如果上面的代码是故意的,用户将不得不明确地请求转换:'foo(s1(x));'这不是一个负担太多 – 2011-04-27 07:19:23

4

在您提供的代码中,这些字段将被初始化。你可以添加一个构造函数(如果你需要/可以),或者如果你需要POD-ness(你的代码的某些部分取决于其中一些属性),并且你不能添加构造函数,你仍然可以使用值初始化在使用场所的结构(即每个成员设置为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 }; 

,将设置x1.0y3.0。由于z没有值,因此编译器将其设置为0.0。请注意,这意味着sample s = {};相当于sample s = sample();

+0

另请参见[this question](http://stackoverflow.com/questions/4932781 /为什么是一个pod-in-a-struct-zero-initial-by-an-implicit-constructor-when-creatin),以便更详细地描述默认值与初始值的关系 – 2011-04-27 07:19:03

1

内置类型,如doubleint被初始化变量是否staticnamespace /文件范围内,否则 - 出于效率的考虑 - 他们没有初始化,除非构造表明这很有用。

注意:此答案解决了“s1 s”问题你描述的情况。定义变量时可以提供明确的初始化,但这是另一种情况。

要添加一个构造函数,因此:

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

就像缺乏其他2个已经存在的答案。 – 2011-04-27 07:18:38