【问题标题】:Why is the initializion of class members not allowed outside of the constructors?为什么不允许在构造函数之外初始化类成员?
【发布时间】:2012-08-24 03:05:12
【问题描述】:

换句话说,为什么编译器会抱怨这样的事情:

class Integer {
  int i = 3;
};

虽然这是一个非常愚蠢的例子,但在很多情况下,类的成员可以默认初始化为某个值(例如,某些内部计数器总是默认初始化为零)。在类构造函数之外禁止这些默认初始化的原因是什么?

【问题讨论】:

  • 这在 C++11 中很好。要搜索的术语是“类内成员初始化”。
  • 因为 C++ 语言委员会没有决定添加该功能?
  • @Adam :嗯,他们确实决定这样做,只是比我们希望的晚了 13 年。 :-P
  • @paulsm4 我看不出类内成员初始化程序如何将其带走。
  • 类内初始化不会改变不变条件,它只是在许多构造函数中设置这些条件的更好方法,而无需从每个构造函数调用 init() 函数的开销一。

标签: c++


【解决方案1】:

因为有构造函数。

class InTeGeR
{
    Public:
           int i;
           InTeGeR()
            {
                i=3;
            }
 }

存在外部构造函数初始化:

class InTeGeR
{
    Public:
           int i=3;
           InTeGeR()
            {
                i=5;
            }
            //now, i could be 3 or 5. Which one? 
            int j=i+1;
            //is j 4 or 6? Very confusing
 }

【讨论】:

  • 好吧,InTeGeR() : i(3) {} 可能会成为通过构造函数实现它的更好示例。
  • 不同之处在于,Andrey 包含了您的所有成员,以及 const 和引用成员,并且不会进行任何不必要的额外初始化。完全没有缺点。
  • 作者已经知道构造函数的存在。问题是为什么不能在构造函数之外完成。
  • 因为在构造函数之外,i 变量的作用域在构造函数之前和之后。当你构造时,它会再次设置为 3,构造函数对 i 没有意义
  • @tuğrulbüyükışık:实际上,如果一个类有许多不同类型的构造函数,并且该类的一个成员是某种应该初始化为零的计数器,我不得不在所有的构造函数。如果我愿意,能够避免这种情况会很好(尽管我同意你的观点,但代码不会像在构造函数中显式初始化所有内容的代码那样好)。
【解决方案2】:

正如 cmets 中所说,在 C++11 中你实际上可以像你展示的那样做。但是在 C++98/C++03 中它仍然是非法的。

编辑:但是要回答您的问题:我不知道:p 也许语言设计者认为在发布 C++98 时没有人愿意这样做。无论如何,您现在当然可以使用 C++11 做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多