【问题标题】:Static Variable initialisation for Classes in C++, why include data type?C ++中类的静态变量初始化,为什么要包含数据类型?
【发布时间】:2013-07-15 16:01:44
【问题描述】:

我一直在学习 C++,并且遇到过静态变量(我有 C89 的先验知识),并且在我使用的资源中,他们在类中声明了一个静态变量,例如:

class nameHere
{
    public:
        static int totalNum;
}

int nameHere::totalNum = 0;

int main()
{}

例如。 我不明白的是,既然我已经在类定义中声明了静态变量是一个整数,为什么我还需要在类定义之外将它声明为一个整数? 像这样简单地初始化它是不是没有意义:

nameHere::totalNum = 0;

int main()
{}

是否有特殊原因或仅仅是 C++ 的约定? 感谢大家的帮助!

【问题讨论】:

  • 可能与我们不能说SomeClass::someMemberFunction {...} 来定义成员函数的原因相同。
  • 想一想,它会稍微简化语法并防止那些因拼写错误或缺少说明符而引起的讨厌的错误,但至少在函数的情况下,它可能很有用将const 放在定义中的值参数上,而不是声明上,尽管如果这种语法是一个选项,我可以习惯使用后者。
  • 这会使语法更加复杂。已经存在声明/表达歧义,这会更进一步。
  • 哦,你必须考虑函数的重载。对于非重载函数,我不明白为什么它不能工作,但是重载会使它变得更复杂。谁知道呢,也许这就是函数没有得到处理的原因,变量也随之而来。我想这总是可能

标签: c++ variables syntax static


【解决方案1】:

定义和声明是有区别的。 虽然已声明类中的静态变量,但尚未定义它。 One Definition Rule,解释声明、定义和状态

在任何翻译单元中,模板、类型、函数或对象只能有一个定义。其中一些可以有任意数量的声明。

因此,声明变量时必须使用对象的完整类型。

【讨论】:

    【解决方案2】:

    C++11中,您可以简单地在类中初始化变量:

    class nameHere
    {
        public:
            static const int totalNum = {0};
    }
    

    【讨论】:

    • 你也可以在 C++03 中做到这一点。我认为 C++11 中的静态数据成员初始化没有任何变化。新的是您可以在声明时初始化非静态数据成员。
    • @juanchopanza,使用static,您现在可以在其中初始化非整数类型,只要它是constexpr
    【解决方案3】:

    这将(可能)使该语言更难解析(而且它已经几乎难以解析)。

    事实上,数据类型(intlongmy_class,等等)告诉编译器它看到的是声明的开始(在这种情况下,它也是一个定义)。没有它,编译器将很难解决问题。

    在全局范围内的特定情况下,它不会那么糟糕,因为在全局范围内你可以拥有的只是一系列声明。然而,在任何其他范围内,事情都会变得更加困难(并且在全局范围内拥有一个规则,而在其他地方拥有另一个规则确实很难看)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多