对成员函数进行编程时更好的做法是什么?

时间:2020-03-06 15:03:34  来源:igfitidea点击:

我已经看到成员函数既在它们所属的类内部进行编程,又在类外部进行编程,并在类内部进行了函数原型设计。我曾经只使用第一种方法进行编程,但是想知道使用其他方法还是个人偏好是更好的做法?

解决方案

假设意思是C ++,最好在类之外定义函数,因为如果将其放在类中,编译器可能会尝试内联它,这并不总是令人满意的:

  • 代码大小的增加(每个包含此标头的目标文件都可能以其代码中的函数副本结尾)。
  • 函数定义更改时破坏二进制兼容性。

即使使用内联函数,通常也最好将定义放在类之外,以提高类公共接口的可读性,除非该函数是琐碎的访问器或者其他一些单一的类。

两种技术都有优势。

如果仅在类定义中放置原型,则使使用类的人更容易查看可用的方法。它们不会因实施细节而分心。

将代码直接放在类定义中可以简化类的使用,我们只需要#include标头即可。这对于模板化类特别有用(必需)。

假设语言是C ++:

底线是个人喜好。班级内部总体上更短,更直接,特别是对于

int getFoo() const { return _foo; }

功能类型。
在te类之外,可以从类定义中删除"混乱"。

我已经看到两者都在使用...

当然,非内联函数始终在类之外。

我假设我们正在谈论C ++。

拥有一个干净整洁的界面无疑是一个好主意。拥有单独的实现文件有助于保持界面整洁。

它还可以减少编译时间,尤其是在使用不透明指针的情况下。

在定义类时,将两种样式混合在一起也是很常见的。对于由1或者2行组成的简单方法,在类定义中定义方法主体是常见且方便的。对于更长的方法,最好在外部进行定义。我们将拥有更易读的类定义,而不会因方法主体而使它们杂乱无章。

隐藏方法的实现是有益的,因为该类的用户不会因实际的实现而分心,也不会对实现进行假设,而这些假设可能会在以后发生变化。

如果我们在类中实现该函数,则不能#将该类包含在多个.cpp文件中,否则链接器会抱怨该函数的多个定义。

因此,通常的做法是将类定义保存在.h文件中,并将成员实现保存在.cpp文件中(通常使用相同的名称)。

对于C ++,将方法定义放在头文件中意味着,即使头只是实现细节,当头改变时,包含给定头的所有内容都必须重新编译。

将定义移出标头意味着仅当标头本身发生更改(添加/删除的功能或者声明已更改)时,才需要重新编译包含标头的文件。这可能会对复杂项目的编译时间产生很大影响。

再次,模拟C ++,我通常将其限制为虚拟函数上的占位符,例如

virtual int MyFunc() {}  // Does nothing in base class, override if needed

其他任何事情,Andrew Medico的观点都太容易插入,并且会损害编译时间。