是否可以在初始化其他成员时省略初始化struct
的成员?
例如,这是我的struct
struct person {
std::string name;
int age;
float weight;
};
在初始化时,我想跳过初始化age
,但初始化其他成员。
例如,我创建了p
类型的变量person
。如果我想给所有成员提供价值,我就会这样做。
person p = {"harry", 25, 70};
相反,我想知道是否可以省略给予价值' 25'同时使用person p
(仅适用于此特定结构变量),并将值赋予其他两个。就像在for
循环中一样,我们可以跳过任何参数,只需将其留空,就像这样
for(int i=0;;i++)
我知道结构不是任何与循环相关的结构,我提到它只是为了通过跳过age
的初始化来解释我的意思。
答案 0 :(得分:1)
基本类型的成员不会自动初始化为C ++中的任何指定值,除非该对象是静态存储类(如全局变量或声明为static
的变量),在这种情况下,它们被初始化为0
所以你不需要做任何特别的事情。只是不要初始化您不希望具有特定值的成员。
目前,只有name
被初始化为结构中的已知值(因为使用了std::string
的默认构造函数。)如果要初始化除age
之外的所有内容,则:
struct person {
std::string name; // default constructed to empty string
int age; // unspecified value
float weight = 0.f;
};
答案 1 :(得分:1)
不幸的是,你的问题不清楚。
age
对于每个person
或仅针对某些person
未初始化?person
与已为其分配有意义值的年龄?如注释中所述,每个成员将在构造时初始化,无论是在构造函数中指定,还是在成员声明中指定,或者是default-initialized。对于基本类型(例如int
),后者不设置值,因此存储的实际值可以是任何值,包括非敏感值(float
的NaN)。
保持基本类型默认初始化(因此未指定值)的唯一原因是效率(例如,在分配大数字时)。但是,这不是这种情况。因此,您应该使用对于真实person
毫无意义的所有成员默认值(以明确它们仅仅是未指定的或未知的')。例如
struct person
{
std::string name; // default: empty
int age = -1; // idea: match age < 0 to 'unknown'
float weight = 0; // idea: match weight <= 0 to 'unknown'
person(std::string const&n) : name(n) {}
person(std::string const&n, int a) : name(n), age(a) {}
person(std::string const&n, float w) : name(n), weight(w) {}
person(std::string const&n, int a, float w) : name(n), age(a), weight(w) {}
};
person A{Utkarsh}; // unknown age, unknown weight
person B{Utkarsh,70.0}; // unknown age, weight=70
person C{Utkarsh,25}; // age=25, unknown weight
person D{Utkarsh,25,70.0}; // age=25, weight=70