【问题标题】:Why must const members be initialized in the constructor initializer rather than in its body?为什么 const 成员必须在构造函数初始化器中而不是在其主体中初始化?
【发布时间】:2010-09-26 04:43:44
【问题描述】:

为什么声明为const 的类成员必须在构造函数初始化列表而不是构造函数体中初始化?

两者有什么区别?

【问题讨论】:

    标签: c++ constructor initialization constants


    【解决方案1】:

    因为常量变量和引用必须在声明时即使用前进行初始化。 但是构造函数会将值分配给变量而不是初始化变量,因此您必须使用 initailizier 列表来获取常量和引用

    【讨论】:

      【解决方案2】:

      在 C++ 中,当执行进入构造函数的主体时,对象被认为已完全初始化。

      你说:

      "我想知道为什么 const 必须是 在构造函数初始化器中初始化 列表而不是正文?”

      您缺少的是 initialisation 发生在初始化列表中,而 assignment 发生在构造函数的主体中。逻辑步骤:

      1) 一个 const 对象只能被初始化。

      2) 一个对象的所有成员都在初始化列表中初始化。即使您没有在此处显式初始化它们,编译器也会很乐意为您这样做:-)

      3) 因此,将 1) 和 2) 放在一起,const 成员只能在初始化时分配一个值,这发生在初始化列表期间。

      【讨论】:

      • 恭喜您的第一个答案... ^_^
      • 关于2号。 ASFAIK 这仅适用于具有默认 ctor 的非内置类型。我想说的是,第一名加上你在列表上面所说的足以回答这个问题。无论如何,我的好回答 +1!
      • @AndreasMagnusson:在 C++11 之前,对所有未在初始化器列表中命名的成员执行默认初始化,包括内置原始类型(默认初始化意味着“根本没有初始化”)。如果没有(可访问的)默认构造函数,则为编译错误。然后大括号或相等初始化器改变了这一切。
      • @BenVoigt:可能是这样,但这是相当多余的信息。对于大多数程序员来说,变量被初始化为“根本没有初始化”或没有被初始化之间的区别纯粹是一个英语语义问题。在行尾,除非程序员明确地为这样的变量赋值,否则它的值将保持未定义(这反过来又会导致大量错误)。简单地说它被初始化意味着它太容易解释了,因为它被初始化为0(在许多其他编程语言中的情况)。
      【解决方案3】:

      const 和引用变量必须在声明它们的行初始化。

       class Something  
       {  
           private:  
            const int m_nValue;  
           public:  
            Something()  
            {  
                m_nValue = 5;  
            }  
        };
      

      会产生相当于;

      const int nValue; // error, const vars must be assigned values immediately  
      nValue = 5; 
      

      在构造函数的主体中分配 const 或引用成员变量值是不够的。

      C++ 提供了另一种初始化成员变量的方法,允许在创建成员变量时而不是之后初始化成员变量。这是通过使用初始化列表来完成的。

      您可以通过两种方式为变量赋值:显式和隐式: 将纯副本查看到剪贴板打印?

      int nValue = 5; // explicit assignment  
      double dValue(4.7); // implicit assignment  
      

      使用初始化列表与进行隐式赋值非常相似。

      请记住,用于初始化基数据对象和成员数据对象的成员初始化列表在定义中,而不是在构造函数的声明中。

      更多关于cpp-tutorialCode Wrangler

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        相关资源
        最近更新 更多