类成员函数声明疑问

时间:2011-09-10 19:11:05

标签: c++ class function inline

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

  

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

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

谢谢:)

5 个答案:

答案 0 :(得分:1)

我的风格:我有时会在课堂上放置极短(一两个班轮)的功能。我仍然想要作为内联函数的任何更长的内容在类定义之后作为inline限定的实现,并且通常在单独的文件中,标题#include位于类定义的末尾。

在类之外放置内联函数的基本原理是某些函数的实现通常只会妨碍人类读者对类的整体理解。二十行函数通常可以在一行注释中进行汇总 - 并且该注释是您在阅读类定义时所需要的全部内容。如果您需要更多,请转到功能定义,或者更好的是,阅读精细文档。 (期待有人阅读F ***代码是精细文档的不良替代品。)

答案 1 :(得分:0)

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

  

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

答案 2 :(得分:0)

这两种方法本身都不是优先事项和风格。就个人而言,我一直认为在单独的.inline文件中明确定义函数是最好的方法。通过这种方式,您可以清楚地了解自己的工作,并保持头文件的清洁。

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

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

然后,您可以在发布中的头文件和调试中的CPP中包含内联文件。这意味着即使编译器在调试中内联函数,在调试时也不会有任何困难。不可否认,这对于编译器来说这不是一个问题,所以除非使用旧的编译器,否则你可能想要跳过这样做。

答案 3 :(得分:0)

一般来说,只有一个或两个语句的成员函数最好用它的正文写在类声明中 - 特别是如果它们有很多。具有超过20-50个语句的成员函数可能最好不在类声明中。对于长度和复杂性,它取决于许多因素。

例如,在类声明不更改时,在类模块中使用函数体有助于防止对依赖模块进行不必要的重新编译 - 仅限成员函数体。这可以大大提高开发课程的效率。一旦课程稳定,这就变得不那么重要了。

答案 4 :(得分:0)

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

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