【问题标题】:Member function definition成员函数定义
【发布时间】:2011-06-17 18:14:30
【问题描述】:

正确的做法是什么:

在类内部定义成员(类)函数?

在类外部定义成员(类)函数?

谢谢。

【问题讨论】:

标签: c++ class function definition member


【解决方案1】:

假设您正在谈论这三种可能性:

  1. 在头文件的类定义中定义的方法。
  2. 方法在头文件中定义外部类定义。
  3. 方法在实现文件中定义外部类定义。

那么项目和公司指南可能会迫使您始终使用 (1) 或 (3)。

当你有选择的时候,恕我直言,最好适应手头的情况,考虑诸如

  • 您想要一个仅标头模块吗?然后(1)默认,(2)可能。
  • 方法是大兽吗?然后是 (2) 或 (3)。
  • 模板方法专业化?然后是 (2) 或 (3)。
  • 存在构建时问题(构建缓慢)?表示 (3)。
  • 模板类? (1) 或可能 (2)

但是,除非你的选择实际上是强加给你的,否则首先要考虑你的代码的清晰

干杯,

【讨论】:

    【解决方案2】:

    一个常见的建议是保持标题尽可能简单和干净。标头将包含在外部代码中,它们必须处理您在那里编写的所有内容。如果你在头文件中写了一个方法,所有的翻译单元都会编译那个函数,只是为了让链接器以后可以丢弃除一个之外的所有函数。

    如果您的代码对不属于您的接口的类型或库有内部依赖,那么通过在类声明中内联成员函数的代码,该类的定义或该库的标头必须包含在您的标头中,这意味着您正在向用户泄露您的实施细节。

    【讨论】:

      【解决方案3】:

      除非成员函数定义是微不足道的(在非正式意义上)并且不引入任何额外的依赖项,否则我通常会在单独的源文件中定义类主体之外的成员函数。

      这通常是样式问题,但在某些情况下是必要的,而在许多其他情况下,需要在类主体之外定义函数。

      例如,如果您有相互依赖的类,并且在类定义之前只能使用另一个类的前向声明,则使用该其他类定义的成员函数只能在该类之外定义在提供了另一个类的完整定义之后的正文。

      【讨论】:

      • +1,因为它带来了重要的决定,但这不是风格问题。通过在类声明中提供实现,您将强制依赖(实现细节)对您的用户(即,如果您使用某个库执行特定计算,您的类的用户将依赖它),它也将具有实用性强制包含您的类的所有翻译单元编译您的所有方法的效果,增加编译时间。
      • @DavidRodríguez:嗯,有一种糟糕的风格 - 甚至是非常糟糕的风格 - 在两者都可能和“正确”的情况下,它必须是一个风格决定,当然?
      • 这就是我投赞成票的原因 :) 您的回答将您必须考虑的最重要的事情纳入范围。
      【解决方案4】:

      您的意思是“在类声明/.h 文件中”与“在 .cpp 文件中使用 ::”?

      如果是这样,我总是选择后者。在调试方面,单步调试并查看发生了什么要容易得多。它还有助于整理类声明,无需了解任何实现细节”

      【讨论】:

        【解决方案5】:

        如果你想在一个类定义一个函数,最基本的语法通常看起来像:

        class Object
        {
          int property;
          void doSomething()
          {
              property=100;
          }
        };
        

        如果你想在外部定义一个函数,它类似于在主文件和库文件中声明函数。在你的课堂上,你有:

        class Object
        {
          int property;
          void doSomething();
        };
        

        然后在你的类之后的某个地方,在 main() 函数之后或在一个包含的文件中,你可以有定义:

        void Object::doSomething()
        {
          property=100;
        }
        

        有些将类放在头文件中,而将定义放在该头文件使用的 cpp 文件中。可以使用各种技术。

        这两种方法都有效。通常我会在类中直接包含非常小的和/或核心类功能,以及其他我倾向于分离的更重的批量工作的功能。试着想想你的代码和想要改变它的区别。

        【讨论】:

          【解决方案6】:

          如果我们根据性能问题看到比在类中声明函数更有效的方法。因为在编译时它连接了所有的函数调用和其他组件,所以它很容易而且必须更快地在一个源中获得所有...

          【讨论】:

          • 一般来说,类体内部和外部定义的方法生成的代码是相同的。性能没有差异。
          猜你喜欢
          • 2012-08-07
          • 2016-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多