类成员函数声明有疑问
Class member function declaration doubt
我正在读一本c++教程,我看到了这句话:
定义类成员函数的唯一区别完全在它的类中,或者只包括原型它的定义是,在第一种情况下,函数将被编译器自动视为内联成员函数,而在第二种情况下,它将是一个普通的(非内联)类成员函数,它实际上假定在行为上没有区别。
我知道内联函数是什么,我的疑问是选择哪种样式。我应该在类内还是在类外定义每个函数?也许是最简单的内部功能和其他外部功能?
我担心在类中定义每个函数(即具有复杂的内联函数)可能会弄乱结果代码,并在执行过程中引入调试问题或奇怪的行为。最后,还有"编码风格"问题。因此,
哪种方法更好?
谢谢你
我的风格:我有时会在类本身中放入非常短的(一个或两个)函数。任何我仍然想要作为内联函数的更长时间,在类定义之后作为inline
合格的实现,并且通常在一个单独的文件中,头#include
在类定义的末尾。
将内联函数放在类之外的理由是,某些函数的实现通常会妨碍人类读者对类的整体理解。一个20行的函数通常可以用一行注释来总结——当您阅读类定义时,这个注释就足够了。如果您需要更多信息,请参阅函数定义,或者更好的方法是阅读the Fine Documentation。(期待别人阅读F***代码是一个糟糕的替代好的文档。)
最好的解决方案是将接口和实现分开。接口是你的h文件。只放置原型。实现转到pcp -file。这种方法有以下优点:
- 编译速度更快,因为不需要多次编译函数体。
- 头依赖更简单,因为不需要在h-file中包含所有的头文件。有些头文件只在pcp -file中需要,您可以在h-file中使用前向声明。你也可以避免循环依赖。
- 最后但并非最不重要的-它更容易为人类理解你的类的接口。没有代码混乱。
回答"哪种方法更好?"-选自c++ FAQ -
没有简单的答案:你必须玩它,看看什么是最好的。不要满足于简单的答案,如"永远不要使用内联函数"或"总是使用内联函数"或"当且仅当函数少于N行代码时使用内联函数"。这些一刀切的规则可能很容易写下来,但它们会产生次优结果。
这两种方法本身都不好,这是偏好和风格的问题。就我个人而言,我总是认为在一个单独的.inline文件中显式地定义函数是最好的方法。通过这种方式,您可以非常明确地了解您所做的工作,并保持头文件的整洁。
此外,如果您使用像INLINE这样的宏,其定义如下:
#ifdef DEBUG
#define INLINE
#else
#define INLINE inline
#endif
您可以在release中包含头文件,在debug中包含CPP文件。这意味着即使编译器在调试中内联了函数,在调试时也不会遇到任何困难。但是,不可否认的是,这对于现在的编译器来说并不是这样的问题,所以除非使用旧的编译器,否则您可能希望跳过此操作。
一般来说,只有一条或两条语句的成员函数最好将其主体写在类声明中,尤其是在有很多语句的情况下。有超过20-50条语句的成员函数最好不要放在类声明中。对于两者之间的长度和复杂性,它取决于许多因素。
例如,当类声明只改变成员函数体时,将函数体放在类模块中有助于防止不必要的重新编译依赖模块。这可以大大提高开发类的效率。一旦类稳定了,这就变得不那么重要了。
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 我在范围内未声明的错误类有问题
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 我的代码中有错误,未声明的标识符
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 在以下声明中使用指针有什么区别?
- 为什么系统日志有两个不同的函数声明?
- 朋友声明的复杂范围界定规则有什么意义?
- 在类内和类外的定义处执行类转发声明是否有区别
- 我对 gdb 内存地址有疑问
- 在 c++ 中是否有通过声明"implicit"数组分配?
- 可以在C 11中有条件声明的朋友类
- 对文件I/O有疑问
- 类成员函数声明有疑问
- MFC:已添加资源,但资源 ID 仍有未声明的标识符
- 对循环中的作用域有疑问
- 对函数指针数组声明有疑问
- visual studio 2010 -智能感知:期望在c++中有一个声明