【问题标题】:How can class fields be initialized?如何初始化类字段?
【发布时间】:2011-03-16 22:17:33
【问题描述】:

一个基本的问题,但我很难找到明确的答案。

除了方法中的赋值之外,初始化器是否列出了唯一在 C++ 中初始化类字段的方法?

如果我使用了错误的术语,这就是我的意思:

class Test
{
public:
    Test(): MyField(47) { }  // acceptable
    int MyField;
};

class Test
{
public:
    int MyField = 47; // invalid: only static const integral data members allowed
};

编辑:特别是,有没有一种用结构初始化器初始化结构字段的好方法?例如:

struct MyStruct { int Number, const char* Text };

MyStruct struct1 = {};  // acceptable: zeroed
MyStruct struct2 = { 47, "Blah" } // acceptable

class MyClass
{
    MyStruct struct3 = ???  // not acceptable
};

【问题讨论】:

  • 在 C++ 中,带有空括号的结构实例通常不会被清零,但会包含垃圾值。异常可能出现在调试环境或类似的受控情况中。
  • @SEinarsson - 哦...你有这方面的参考吗?整个网络都建议使用空括号来初始化 C++ 中的结构。
  • 等等,现在我不太确定。我发现网上有人说我错了,但 {} 模式没有正式定义。以下问题暗示 C++ 中的结构类具有归零默认构造函数,当在类初始化程序中使用时(请参阅第二个答案)stackoverflow.com/questions/112085/… 请忽略我上面的评论,直到我能澄清这一点。

标签: c++ initialization ctor-initializer


【解决方案1】:

推荐和首选的方法是初始化构造函数中的所有字段,就像在您的第一个示例中一样。这对结构也有效。见这里:Initializing static struct tm in a class

【讨论】:

    【解决方案2】:

    静态成员可以不同的方式初始化:

    class Test {
        ....
        static int x;
    };
    
    int Test::x = 5;
    

    我不知道你是否称它为“nice”,但你可以像这样相当干净地初始化结构成员:

    struct stype {
    const char *str;
    int val;
    };
    
    stype initialSVal = {
    "hi",
    7
    };
    
    class Test {
    public:
        Test(): s(initialSVal) {}
        stype s;
    };
    

    【讨论】:

      【解决方案3】:

      在 C++x0 中,第二种方式也应该有效。

      初始化器列表是在 C++ 中初始化类字段的唯一方法吗?

      就你的编译器而言:是的。

      【讨论】:

        【解决方案4】:

        顺便提一下,在某些情况下,您别无选择,只能使用初始化列表来设置成员的构造值:

        class A
        {
         private:
        
          int b;
          const int c;
        
         public:
        
         A() :
          b(1),
          c(1)
         {
          // Here you could also do:
          b = 1; // This would be a reassignation, not an initialization.
                // But not:
          c = 1; // You can't : c is a const member.
         }
        };
        

        【讨论】:

          猜你喜欢
          • 2014-03-21
          • 1970-01-01
          • 2010-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 1970-01-01
          相关资源
          最近更新 更多