对成员函数进行编程时更好的做法是什么?
我已经看到成员函数既在它们所属的类内部进行编程,又在类外部进行编程,并在类内部进行了函数原型设计。我曾经只使用第一种方法进行编程,但是想知道使用其他方法还是个人偏好是更好的做法?
解决方案
假设意思是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的观点都太容易插入,并且会损害编译时间。