帮助程序函数应该放在标头中还是在实现文件中

Should a helper function go in the header or in the implementation file?

本文关键字:文件 实现 函数 帮助程序      更新时间:2023-10-16

在C++中为类编写帮助程序方法时,是否应该在头 (.h) 文件的类定义中将其声明为私有方法?例如:

/*Foo.h*/
class Foo {
     public:
         int bar();
     private:
         int helper();
};
...
/*Foo.cpp*/
...
int foo::bar() {
    int something = this->helper();
}
int foo::helper() {
    ...
}

或者,是否最好不要将其声明为类的私有成员,而只是在实现中使其成为独立的函数?

/*Foo.h*/
class Foo {
    public:
        int bar();
};
...
/*Foo.cpp*/
...
int Foo::bar() {
    int something = helper();
    ...
}
int helper() {
    ...   
}

实现文件中的独立函数改进了封装:它不需要在标头中声明,因此当其签名因任何原因更改时,无需重新编译客户端代码。对我来说,这是一个很好的理由,只要可行,就更喜欢这个选项。(请务必将其放在匿名命名空间中,以防止在链接时发生标识符冲突。

但是,private方法可以通过this指针访问类实例及其私有部分。如果它需要这样的访问,那么它必须是一个方法或一个friend 。在这两种情况下,它都将在类定义(头文件)中可见,并且方法比朋友更方便。

如果您的帮助程序函数有意义的对象方法,我几乎总是希望将其设置为成员函数,以便有一个隐式this指针,而不是将Foo *传递给帮助程序函数。

如果帮助程序函数不需要是对象的方法(即,它不需要访问数据成员或其他成员函数),则使其成为独立函数(最好是static或匿名命名空间)。

我认为

这有点主观。

在我看来,这取决于它是否与类的成员有任何关系和/或您是否希望友元类使用它(或在protected访问的情况下使用派生类)。

如果该函数实际上并未在任何成员上运行,并且没有其他人对它感兴趣,则应将其作为静态函数保留在实现文件中。 此外,如果这是一个必须快速的操作,您可以借此机会使其inline

相反,如果函数对类进行操作,或者在派生类或相关类中可能有额外的用途,则使其成为成员。

我的立场是,标题包含尽可能少的广告,同时实现所需的设计和布局属性。如果有选项,它会进入源。但是,某些内部细节需要访问类的太多内部细节,以便将其放入实现中。