嗨,我是新来的学习C++,我只是有一个快速的问题。在C++中创建数组
如果我正在创建一个包含5个结构的数组,我应该在构造时清除如下所示的数组,或者将其保留为当我声明它时。
换句话说是做这样的事情
person a[5];
for(int i = 0; i < 5; i++)
{
a[i].name= "";
a[i].value= 0;
}
一样做这样的事情,请大家注意,我基本上都会通过这些循环后,并设置这些值。
person[5];
嗨,我是新来的学习C++,我只是有一个快速的问题。在C++中创建数组
如果我正在创建一个包含5个结构的数组,我应该在构造时清除如下所示的数组,或者将其保留为当我声明它时。
换句话说是做这样的事情
person a[5];
for(int i = 0; i < 5; i++)
{
a[i].name= "";
a[i].value= 0;
}
一样做这样的事情,请大家注意,我基本上都会通过这些循环后,并设置这些值。
person[5];
只有具有静态存储持续时间的POD类型在创建时被初始化为零。但是由于使用未初始化的变量会产生未定义的行为,因此即使可能是多余的,也可以明确初始化变量。
但不是在一个循环中对其进行初始化,这是更好地定义一个默认的构造函数,当它被建造,这将初始化的person
实例的数据成员:
struct person
{
person() : value(0) { }
std::string name;
int value;
}
而且还要注意使用STL容器如std::vector
比使用
C风格的数组:)更好的主意
“你的结构是一个POD类型” - 不,它不是,不与'std :: string'里面。你不需要初始化为空的字符串“”,它有默认的构造函数,它会这样做 – 2013-03-14 16:46:46
你不能说它是POD而不知道它的成员是什么类型。 – juanchopanza 2013-03-14 16:47:57
@juanchopanza,aleguna:编辑。 – LihO 2013-03-14 16:53:34
不,你不知道。你需要的是一个合适的默认构造函数person
当然,这具有呈现“人”非聚合的结果。这不是一个问题,但值得一提的是。另外,根据数据成员的类型,用户定义的默认构造函数可能不是必需的。 – juanchopanza 2013-03-14 16:46:50
有没有什么原因导致你不能使用vector?这是他们C++的方式,它会更容易,更不容易有这样的错误。这里有一个例子:
#include <vector>
std::vector<person> a ;
a.push_back(person(...)) ;
此外,如前所述,如果你需要使用数组,然后有默认的构造函数为person
确保你不需要初始化以后。例如:
class person
{
public:
person() : value(0) {...} // default constructor
};
也许他们想要一个固定的大小,总体结构。 – juanchopanza 2013-03-14 16:45:01
@juanchopanza我修改了提及默认ctor,如果他们需要使用数组 – 2013-03-14 16:45:53
只写一个默认的构造函数为person
,假设它是一个struct
或class
。 它将被调用来自动初始化每个数组元素。
一般而言,您应该更喜欢使用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)));
}
最后,如果你不介意有未初始化的内存,你的第一个版本(没有构造函数和没有循环)是好的。但是,请注意,丢失跟踪哪些元素/成员是有效的,哪些是垃圾,是错误的肥沃来源。
如上人提到的[5]是第六位置
在C++中不使用阵列,而使用载体
在第一行,在这里声明您的阵列,默认person
构造将被调用5次(每个元素的数组一次)。如果您的person
构造函数将name
和value
元素初始化为合理的值,则不需要您的循环。
不,它们不一样。
在第一个例子:
person a[5];
您正在声明长度5的阵列型的人,。
然而,这样的:
person[5]
这是无效的 - 没有变量名,被分配没什么,没什么,你可以通过以后循环。
'人[5]'是第6位FYI – 2013-03-14 16:39:59
这真的取决于结构本身的细节。当然你想达到的目标。 – juanchopanza 2013-03-14 16:41:53