嗨,我是学习 C++ 的新手,我有一个简单的问题。
如果我正在创建一个包含 5 个结构的数组,我应该在构造时清除数组,如下所示,还是在我声明它时保留它。
换句话说,正在做类似的事情
person a[5];
for(int i = 0; i < 5; i++)
{
a[i].name= "";
a[i].value= 0;
}
就像做这样的事情一样,请注意,我稍后将基本上循环并设置这些值。
person[5];
不,你没有。您需要的是一个适当的默认构造函数person
只需为 编写一个默认构造函数person
,假设它是 astruct
或class
。它将被调用以自动初始化每个数组元素。
一般来说,您可能应该更喜欢使用std::vector<person>
,但您没有给出足够的上下文来确定。
默认构造函数看起来像:this(注意它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)));
}
最后,如果您不介意周围有未初始化的内存,那么您的第一个版本(没有构造函数和循环)就可以了。但是,请注意,忘记哪些元素/成员是有效的,哪些是垃圾,是错误的肥沃来源。
有什么理由不能使用矢量吗?这是他们的 C++ 方式,这样会更容易并且不太可能出现错误。这是一个例子:
#include <vector>
std::vector<person> a ;
a.push_back( person(...) ) ;
此外,如前所述,如果您需要使用数组,则具有默认构造函数以person
确保您以后不需要初始化。例如:
class person
{
public:
person() : value(0) {...} // default constructor
};
如上所述,人[5]是第6位
在 C++ 中不要使用数组,而是使用向量
只有具有静态存储持续时间的 POD 类型在创建时才进行零初始化。但是由于使用未初始化的变量会产生未定义的行为,因此显式初始化变量被认为是一种好习惯,即使它可能是多余的。
但与其在循环中初始化它,不如定义一个默认构造函数,它会在person
构造实例时初始化实例的数据成员:
struct person
{
person() : value(0) { }
std::string name;
int value;
}
还要注意,使用 STL 容器比使用
C 样式数组std::vector
要好得多:)
在声明数组的第一行,默认person
构造函数将被调用 5 次(数组的每个元素一次)。如果您的构造函数将and元素person
初始化为合理的值,则不需要循环。name
value
不,它们不一样。
在第一个示例中:
person a[5];
您正在声明一个长度为 5 的数组,类型为 person。
然而,这:
person[5]
这是无效的 - 没有变量名,没有要分配的内容,也没有您以后可以循环的内容。