问题 C ++中Classes的静态变量初始化,为什么包括数据类型?


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

class nameHere
{
    public:
        static int totalNum;
}

int nameHere::totalNum = 0;

int main()
{}

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

nameHere::totalNum = 0;

int main()
{}

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


12702
2017-07-17 07:46


起源

可能我们不能说的原因相同 SomeClass::someMemberFunction {...} 定义成员函数。 - chris
想一想,它会稍微减轻语法并防止因拼写错误或缺少说明符而产生的那些令人讨厌的错误,但至少在函数的情况下,放置它会很有用 const 关于定义中的值参数,但不是声明,但如果这个语法是一个选项我可以习惯做后者。 - chris
它会使语法复杂化。已经有一个声明/表达模糊,这将更进一步。 - Angew
@chris,我同意。 - user1750028
哦,你必须考虑功能的重载。对于非重载函数,我不明白为什么它不会 工作,但过载会使它更复杂。谁知道,也许这就是没有给予治疗的功能背后的理由,并且变量也随之而来。总是如此 可能 我猜。 - chris


答案:


这可能(可能)使语言更难以解析(并且无论如何已经几乎非常难以解析)。

实际上,数据类型(intlongmy_class,无论如何)告诉编译器它所看到的是声明的开头(在这种情况下,它也是一个定义)。如果没有这个,编译器就会有更困难的时间来解决问题。

在全球范围内的特定情况下,它不会那么糟糕,因为在全球范围内,您可以拥有的是一系列声明。然而,在任何其他范围内,事情会更加困难(并且在全球范围内有一条规则,而另一条规则确实是丑陋的)。


7
2017-07-17 08:03





C ++ 11 你可以简单地初始化类中的变量:

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

3
2017-07-17 08:08



@Angew,对,我编辑了这篇文章 - Pascalau Razvan
你也可以在C ++ 03中做到这一点。我认为C ++ 11中的静态数据成员初始化没有任何变化。新的是你在声明时初始化非静态数据成员。 - juanchopanza
@juanchopanza,With static,你现在可以在那里初始化非整数类型,只要它是a constexpr。 - chris


定义和声明之间存在差异。 虽然已声明类中的静态变量,但尚未定义。该 一个定义规则,解释声明,定义和陈述

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

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


2
2017-07-17 08:03