2013-03-14 170 views
2

嗨,我是新来的学习C++,我只是有一个快速的问题。在C++中创建数组

如果我正在创建一个包含5个结构的数组,我应该在构造时清除如下所示的数组,或者将其保留为当我声明它时。

换句话说是做这样的事情

person a[5]; 

for(int i = 0; i < 5; i++) 
{ 
    a[i].name= ""; 
    a[i].value= 0; 
} 

一样做这样的事情,请大家注意,我基本上都会通过这些循环后,并设置这些值。

person[5]; 
+0

'人[5]'是第6位FYI – 2013-03-14 16:39:59

+1

这真的取决于结构本身的细节。当然你想达到的目标。 – juanchopanza 2013-03-14 16:41:53

回答

2

只有具有静态存储持续时间的POD类型在创建时被初始化为零。但是由于使用未初始化的变量会产生未定义的行为,因此即使可能是多余的,也可以明确初始化变量。

但不是在一个循环中对其进行初始化,这是更好地定义一个默认的构造函数,当它被建造,这将初始化的person实例的数据成员:

struct person 
{ 
    person() : value(0) { } 

    std::string name; 
    int value; 
} 

而且还要注意使用STL容器如std::vector比使用
C风格的数组:)更好的主意

+0

“你的结构是一个POD类型” - 不,它不是,不与'std :: string'里面。你不需要初始化为空的字符串“”,它有默认的构造函数,它会这样做 – 2013-03-14 16:46:46

+0

你不能说它是POD而不知道它的成员是什么类型。 – juanchopanza 2013-03-14 16:47:57

+0

@juanchopanza,aleguna:编辑。 – LihO 2013-03-14 16:53:34

3

不,你不知道。你需要的是一个合适的默认构造函数person

+0

当然,这具有呈现“人”非聚合的结果。这不是一个问题,但值得一提的是。另外,根据数据成员的类型,用户定义的默认构造函数可能不是必需的。 – juanchopanza 2013-03-14 16:46:50

2

有没有什么原因导致你不能使用vector?这是他们C++的方式,它会更容易,更不容易有这样的错误。这里有一个例子:

#include <vector> 

std::vector<person> a ; 

a.push_back(person(...)) ; 

此外,如前所述,如果你需要使用数组,然后有默认的构造函数为person确保你不需要初始化以后。例如:

class person 
{ 
    public: 
    person() : value(0) {...} // default constructor 
}; 
+0

也许他们想要一个固定的大小,总体结构。 – juanchopanza 2013-03-14 16:45:01

+0

@juanchopanza我修改了提及默认ctor,如果他们需要使用数组 – 2013-03-14 16:45:53

3

只写一个默认的构造函数为person,假设它是一个structclass。 它将被调用来自动初始化每个数组元素。

一般而言,您应该更喜欢使用std::vector<person>来代替,但您没有给出足够的上下文来说明问题。


默认的构造看起来是这样的:这(注意:std::string都有自己默认的构造函数,所以我们并不需要做任何事情)

struct person { 
    std::string name; 
    int value; 

    person() : value(0) {} 
}; 

现在这个:

person a[5]; 

已正确初始化,没有进一步的努力。


如果你打算以后反正初始化元素“正常”,然后使用矢量可以更容易地跳过浪费虚拟初始化:

struct person { 
    std::string name; 
    int value; 

    person() : value(0) {} 
    person(std::string const &n, int v) : name(n), value(v) {} 
}; 

std::vector<person> people; 
people.reserve(5); 
// just create each person with the right values in the first place: 
for (int i = 0; i < 5; ++i) { 
    people.push_back(person(get_name(i), get_value(i))); 
} 

最后,如果你不介意有未初始化的内存,你的第一个版本(没有构造函数和没有循环)是好的。但是,请注意,丢失跟踪哪些元素/成员是有效的,哪些是垃圾,是错误的肥沃来源。

2

如上人提到的[5]是第六位置

在C++中不使用阵列,而使用载体

0

在第一行,在这里声明您的阵列,默认person构造将被调用5次(每个元素的数组一次)。如果您的person构造函数将namevalue元素初始化为合理的值,则不需要您的循环。

0

不,它们不一样。

在第一个例子:

person a[5]; 

您正在声明长度5的阵列型的人,。

然而,这样的:

person[5] 

这是无效的 - 没有变量名,被分配没什么,没什么,你可以通过以后循环。