14

在 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() {
    ...   
}
4

4 回答 4

24

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

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

于 2012-10-04T23:00:45.073 回答
4

如果您的辅助函数作为对象的方法有意义,我几乎总是更愿意将其设为成员函数,以便有一个隐式this指针,而不是将 a 传递Foo *给辅助函数。

如果辅助函数不需要是对象的方法(也就是说,它不需要访问数据成员或其他成员函数),则将其设为独立函数(static或最好在匿名命名空间中)。

于 2012-10-04T23:01:01.243 回答
2

我认为这有点主观。

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

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

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

于 2012-10-04T23:02:03.627 回答
1

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

于 2012-10-04T23:00:52.743 回答