【问题标题】:'static' for c++ class member functions?c++ 类成员函数的“静态”?
【发布时间】:2010-02-25 01:46:08
【问题描述】:

为什么需要静态关键字?

为什么编译器不能推断它是否是“静态的”?

如下:

我可以在不访问非静态成员数据的情况下编译这个函数吗?是-> 静态功能。 否 -> 非静态函数。

有什么理由不能推断出来吗?

【问题讨论】:

    标签: c++ function static


    【解决方案1】:

    如果您希望编译器当场决定它是否是静态的,这将如何影响链接到仅定义方法签名的头文件的外部源文件?

    【讨论】:

      【解决方案2】:

      静态或非静态属性会影响函数类型。例如,非静态成员函数有一个隐含的this 参数,而静态成员函数则没有。

      换句话说,静态成员函数和非静态成员函数之间有很大的质的区别。编译器无法“推断”这一点。这是作者的意图问题。

      如果我希望(并且需要)我的函数是非静态的,我将其设为非静态,即使它不访问类的任何非静态成员。如果编译器突然决定将我的非静态函数设为静态只是因为它不访问类的任何非静态成员,通常情况下它会破坏代码的功能。

      【讨论】:

        【解决方案3】:

        是的,编译器可以,但它不知道您的意图。最初的设计师可能认为提供您的意图很重要。

        【讨论】:

          【解决方案4】:

          在语言中这样的冗余有助于确保许多程序员错误最终会被编译器捕获。

          【讨论】:

            【解决方案5】:

            另一个原因:如果函数是静态的,它就不能在派生类中被覆盖。没有多态性。

            【讨论】:

            • 这是虚拟的,不是静态的。静态和非静态基成员都可以被派生类隐藏,例如 std::fstream::rdbuf。
            • @Roger:他在问为什么不访问任何成员变量的方法不会被编译器自动声明为static。我是说虚拟方法可能会也可能不会访问成员变量,但您不希望编译器自动将它们声明为静态。
            • 一个虚拟方法,仅仅由于是虚拟的,总是意味着访问成员变量。即,vtable。而且由于我们只讨论隐式静态,而不是隐式虚拟,任何标记为虚拟的方法都不会自动分类为静态。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多