类成员函数声明有疑问

Class member function declaration doubt

本文关键字:有疑问 声明 函数 成员      更新时间:2023-10-16

我正在读一本c++教程,我看到了这句话:

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

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

谢谢你

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

将内联函数放在类之外的理由是,某些函数的实现通常会妨碍人类读者对类的整体理解。一个20行的函数通常可以用一行注释来总结——当您阅读类定义时,这个注释就足够了。如果您需要更多信息,请参阅函数定义,或者更好的方法是阅读the Fine Documentation。(期待别人阅读F***代码是一个糟糕的替代好的文档。)

最好的解决方案是将接口和实现分开。接口是你的h文件。只放置原型。实现转到pcp -file。这种方法有以下优点:

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

回答"哪种方法更好?"-选自c++ FAQ -

没有简单的答案:你必须玩它,看看什么是最好的。不要满足于简单的答案,如"永远不要使用内联函数"或"总是使用内联函数"或"当且仅当函数少于N行代码时使用内联函数"。这些一刀切的规则可能很容易写下来,但它们会产生次优结果。

这两种方法本身都不好,这是偏好和风格的问题。就我个人而言,我总是认为在一个单独的.inline文件中显式地定义函数是最好的方法。通过这种方式,您可以非常明确地了解您所做的工作,并保持头文件的整洁。

此外,如果您使用像INLINE这样的宏,其定义如下:

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

您可以在release中包含头文件,在debug中包含CPP文件。这意味着即使编译器在调试中内联了函数,在调试时也不会遇到任何困难。但是,不可否认的是,这对于现在的编译器来说并不是这样的问题,所以除非使用旧的编译器,否则您可能希望跳过此操作。

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

例如,当类声明只改变成员函数体时,将函数体放在类模块中有助于防止不必要的重新编译依赖模块。这可以大大提高开发类的效率。一旦类稳定了,这就变得不那么重要了。