编程成员函数时有什么更好的做法?

时间:2008-10-03 02:45:49

标签: class member-functions

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

8 个答案:

答案 0 :(得分:6)

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

  1. 代码大小增加(包含此标头的每个目标文件最终都会在代码中包含该函数的副本)。
  2. 在功能定义发生变化时打破二进制兼容性。
  3. 即使使用内联函数,通常通常更好地将定义放在类之外以提高类公共接口的可读性,除非该函数是一个简单的访问器或其他一行代码。

答案 1 :(得分:4)

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

将标题移出标题意味着只有当标题本身发生更改(添加/删除函数或声明已更改)时,才需要重新编译包含标题的文件。这对复杂项目的编译时间有很大影响。

答案 2 :(得分:2)

两种技术都有优势。

如果您只在类定义中放置原型,那么使用您的类的人可以更轻松地查看可用的方法。他们不会被实施细节分心。

将代码直接放在类定义中使得使用类更简单,只需要#include一个头。这对模板化的类特别有用(必要)。

答案 3 :(得分:2)

假设语言是C ++:

底线是个人偏好。课堂内部整体更短,更直接,特别是对于

int getFoo() const { return _foo; }

功能类型。 在课堂外,可以从课程定义中删除“混乱”。

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

当然,非内联函数总是在课堂之外。

答案 4 :(得分:2)

在定义类时混合使用两种样式也很常见。对于由1或2行组成的简单方法,在类定义中定义方法体是常见且方便的。对于更冗长的方法,最好在外部定义它们。您将拥有更多可读的类定义,而不会使用方法体将它们弄乱。

隐藏方法的实现是有益的,因为类的用户不会被实际实现分散注意力,或者对可能在以后改变的实现做出假设。

答案 5 :(得分:1)

我假设你在谈论C ++。

拥有一个漂亮而干净的界面当然是个好主意。拥有单独的实现文件有助于保持界面清洁。

它还减少了编译时间,尤其是在使用opaque pointer时。

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

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

其他任何事情,安德鲁·梅迪科的观点太过容易,并且会伤害编译时间。