在初始化其他成员时跳过结构成员的初始化

时间:2017-08-01 12:48:15

标签: c++

是否可以在初始化其他成员时省略初始化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的初始化来解释我的意思。

2 个答案:

答案 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)

不幸的是,你的问题不清楚。

  1. 您是否希望age对于每个person或仅针对某些person未初始化?
  2. 您如何区分初始化年龄的person与已为其分配有意义值的年龄?
  3. 如注释中所述,每个成员将在构造时初始化,无论是在构造函数中指定,还是在成员声明中指定,或者是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