5

假设您有以下非静态成员函数:

// .h
struct C {
    void f();
}

现在假设您想C::f通过使用特定于 的一些子函数来实现C::f,以使其更短且更具可读性;例如:

// .cpp
void C::f() {
    h1();
    h2();
    //...
    hn();
}

假设这些 h() 的许多函数不需要访问任何数据成员。这意味着您可以将函数定义为静态自由函数(在一个 .cpp 中)或成员函数(静态或非静态)。

你会让它们成为 C 的静态自由函数或函数成员吗?

第一种情况的一个优点是您不必在以下位置声明它们C

// .cpp
static void h1() {//...}
static void h2() {//...}
static void hn() {//...}

另外,如果我没记错的话,没有全局命名空间污染的风险,因为它们是static,也就是说它们只能从同一单元 .cpp (其中还定义了 C::f )内的其他函数中看到。

而在第二种情况下,您必须在 中声明它们C,尽管正如我所说,它们只应该由C::f.

// .h
struct C {
    void f();
  private:
    static void h1(); // can be either static or non-static
    static void h2();
    static void hn();
}

// .cpp
void C::h1() {//...}
void C::h2() {//...}
void C::hn() {//...}

我认为第二个版本会无缘无故地导致代码臃肿,尤其是如果您最终不得不拆分其他长成员函数,例如C::f使代码更具可读性。

4

2 回答 2

3

我建议使用匿名命名空间:

namespace {
    void C::h1() {/...}
    void C::h2() {/...}
    void C::h3() {/...}
}

(见这个问题

这样,您可以保证该函数在它定义的文件之外可见,因此您绝不会污染您的全局命名空间——这将是我对免费静态函数的主要关注点。

将它们设为类的私有成员会将函数接口暴露给全世界(当您发布 *.h 文件时),因此只会无缘无故地使接口变得更加复杂。(您可以在此处添加更多参数,例如更改私有函数的定义时会增加编译时间)

搜索“匿名命名空间”会导致一些关于该主题的有趣讨论。

于 2012-09-04T03:39:22.360 回答
1

只有你能回答这个问题。如果它们永远不会在外部使用, C::f那么污染全局命名空间是没有意义的。我个人会让它们成为C. 如果它们可以标记为静态,那么就这样做,但如果它们真的只fstatic.

于 2012-09-04T03:33:15.580 回答