作为类成员的函数的定义

Posted

技术标签:

【中文标题】作为类成员的函数的定义【英文标题】:Definition of function which is the class member 【发布时间】:2015-05-01 03:15:14 【问题描述】:

我有两个函数,它们是“数据”类的私有成员:

class Date

private:
    bool leapYear(int y);
    void fillDate(int d, Month m, int y);
;

那么,最好在哪里定义这个函数:

在类定义中; 在类外的头文件中; 或在“.cpp”文件中?

【问题讨论】:

所有这些方法都有其优点和缺点。这取决于。而且您忘记将Pimpl idiom 列为第四选择。 我通常会在 cpp 文件中实现,因为我发现这是我在寻找函数实现时通常会参考的地方,但实际上我认为它可能归结为偏好/约定。如果您在一个项目中作为一个团队工作,那么最好为这个概念坚持一个明确定义的规则。 使用选项 1 或选项 3,在这种情况下都很好。重要的是要保持一致。 【参考方案1】:

您可以在这里选择。这里有一些想法可以让你思考:

内联速度不再是一个问题,因为编译器现在擅长链接时间优化。所以性能不应该是这里的决定因素(编译速度也很重要,但这是另一个蠕虫包)。 在类内部定义的小型内联成员函数可能是“记录”类所做工作的一种简单方法。此外,这往往会使实现保持本地化,这在阅读代码时很舒服。但是不要过度。 大函数原则上应该进入它们自己的文件,或者至少在类定义之外,因为它们无缘无故地使类定义代码混乱。模板代码也不例外。 Pimpl 也有优点/缺点,但在这里我看不出有什么好的理由在您的简单案例中引入此类野兽。它们通常用于减少头文件之间的依赖关系。

在这里,如果实现很小,您可以在类内部编写内联代码。但如果逻辑复杂,你应该把它们放在自己的实现(“.cpp”)文件中。

您也可以开始内联,当代码变得更复杂时,将实现移动到它自己的文件中。

【讨论】:

那么,这个想法也适合私有成员函数? @FireCrosser:是的,还有非成员函数和运算符。【参考方案2】:

我强烈不鼓励您考虑选项 2。如果您将此文件包含在多个实现文件中,则链接器会出现“多重定义”错误,因为定义将(由预处理器)复制到每个 .cpp文件。

【讨论】:

您可以使用inline 关键字告诉链接器不要混淆。【参考方案3】:

我对此的个人理念是将所有函数定义放入实现 (.cpp) 文件中,因为首先,它将声明(+文档)与定义分开,这增加了 IMO 的代码清晰度,其次,具有所有定义都在一个地方(实现文件)使我更容易找到函数。根据我的经验,必须在头文件和实现文件之间切换以查看我正在寻找的这个特定函数是内联/定义在头文件中还是在实现文件中,这总是很麻烦。在实现文件中包含所有函数定义意味着我知道我会在该文件中找到 any 函数的定义,而不必浪费时间切换和查看。

【讨论】:

我同意你的观点,但我只需要解决这个问题 - 我应该将 member 的定义以及最重要的 private 功能? 嗯...在cpp文件中?您可以在实现文件中定义私有成员函数,就像您可以公开成员函数一样。

以上是关于作为类成员的函数的定义的主要内容,如果未能解决你的问题,请参考以下文章

类_类的定义

继承和派生

c++,类的对象作为形参时一定会调用复制构造函数吗?

将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

重载运算符问题

使用 C++ 类成员函数作为 C 回调函数