辅助工具的静态自由函数或成员函数?

时间:2012-09-04 03:31:39

标签: c++

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

// .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(in其中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)以使代码更具可读性。

2 个答案:

答案 0 :(得分:3)

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

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

(见this question

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

使它们成为类的私有成员会向全世界公开函数接口(当您发布* .h文件时),因此无缘无故地使接口变得更加复杂。 (这里可以添加更多参数,例如更改私有函数定义时的更高编译时间)

搜索“匿名命名空间”会引发一些关于此主题的有趣讨论。

答案 1 :(得分:1)

只有你能回答这个问题。如果它们永远不会在C::f之外使用,那么污染全局命名空间就没有意义了。我个人会将它们作为C的成员函数。如果它们可以被标记为静态,那么这样做,但如果它们真的只对f有影响,那么只需将它们命名为表示这一点,并且不要担心static