【问题标题】:Class member function declaration doubt类成员函数声明疑问
【发布时间】:2011-09-10 19:11:04
【问题描述】:

我正在阅读 C++ 教程,我遇到了这句话:

定义类成员函数的唯一区别 完全在其类中或仅包括原型及以后 它的定义是,在第一种情况下,函数将 编译器自动将其视为内联成员函数, 而在第二个它将是一个普通(非内联)类成员 函数,实际上假设行为没有区别。

我知道内联函数是什么,我的疑问是选择哪种样式。我应该在其类内部还是外部定义每个函数?也许是内部最简单的功能和外部的其他功能?
我担心在类中定义每个函数(即具有复杂的内联函数)可能会弄乱生成的代码并在执行过程中引入调试问题或奇怪的行为。最后,还有“编码风格”问题。那么,
哪种方法更好?

谢谢你:)

【问题讨论】:

  • “更好”从什么角度?我倾向于担心代码的读者/维护者是第一个关注点。除非分析器另有说明,否则性能是次要问题。
  • @David Hammen:这就是“编码风格”问题。但是现在我是一个爱好程序员,这几年都不会成为问题;)
  • 如果您无法破译您六个月前写的内容,那么这可能会成为您六个月后的问题。也许你自己的代码最重要的读者就是你自己。

标签: c++ class function inline


【解决方案1】:

我的风格:我有时会在类本身中放置非常短的(一两个线性)函数。我仍然想要作为内联函数的任何更长的时间都可以在类定义之后作为 inline 合格的实现,并且通常在一个单独的文件中,标题 #includes 在类定义的末尾。

将内联函数放在类之外的基本原理是,某些函数的实现通常只会妨碍人类读者对类的整体理解。一个 20 行的函数通常可以总结为一行注释——当您阅读类定义时,只需要该注释即可。如果您需要更多,请转到函数定义,或者更好的是,阅读精美文档。 (期望有人阅读 F*** 代码是精细文档的糟糕替代品。)

【讨论】:

    【解决方案2】:

    最好的解决方案是分离接口和实现。接口是你的 h 文件。只放原型。实施转到 cpp 文件。这种方法具有以下优点:

    1. 编译速度更快,因为不需要多次编译函数体。
    2. 头文件依赖更简单,因为不需要将所有头文件都包含到 h 文件中。某些标头仅在 cpp 文件中需要,您可以在 h 文件中使用前向声明。您还可以避免循环依赖。
    3. 最后但并非最不重要的一点 - 人类更容易理解你的类的界面。没有代码混乱。

    【讨论】:

      【解决方案3】:

      回答“哪种方法更好?”部分- 来自C++ FAQ -

      没有简单的答案:您必须玩弄它才能看到什么是最好的。不要满足于简单的答案,例如“从不使用内联函数”或“始终使用内联函数”或“当且仅当函数少于 N 行代码时才使用内联函数”。这些千篇一律的规则可能很容易写下来,但它们会产生次优结果。

      【讨论】:

        【解决方案4】:

        这两种方法本身都不是更好的,因为它是偏好和风格的问题。就我个人而言,我一直认为在单独的 .inline 文件中明确定义函数是最好的方法。这样你就可以非常明确地知道你做了什么,并且保持头文件干净。

        此外,如果您使用诸如 INLINE 之类的宏,其定义如下:

        #ifdef DEBUG 
            #define INLINE
        #else
            #define INLINE inline
        #endif
        

        然后,您可以在发行版中包含来自标头的内联文件,在调试中包含来自 CPP 的内联文件。这意味着即使编译器在调试中内联函数,您在调试时也不会遇到任何困难。不过,诚然,这对现在的编译器来说已经不是什么问题了,所以你可能不想这样做,除非使用旧的编译器。

        【讨论】:

          【解决方案5】:

          一般来说,只有一个或两个语句的成员函数可能最好将它的主体写在类声明中——尤其是当它们有很多时。具有超过 20-50 条语句的成员函数可能最好不在类声明中。对于两者之间的长度和复杂性,它取决于许多因素。

          例如,在类模块中包含函数体有助于防止在类声明不变时不必要地重新编译依赖模块——只有成员函数体。这可以在开发课程时大大提高生产力。一旦类稳定了,这变得不那么重要了。

          【讨论】:

            猜你喜欢
            • 2017-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-04
            • 2017-12-17
            • 2014-08-05
            • 2011-11-23
            相关资源
            最近更新 更多