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

Mar*_*tin 5 c++

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

// .h
struct C {
    void f();
}
Run Code Online (Sandbox Code Playgroud)

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

// .cpp
void C::f() {
    h1();
    h2();
    //...
    hn();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

// .cpp
static void h1() {//...}
static void h2() {//...}
static void hn() {//...}
Run Code Online (Sandbox Code Playgroud)

此外,如果我没有错,则不存在全局命名空间污染的风险,因为它们是静态的,即它们只能从同一单元.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() {//...}
Run Code Online (Sandbox Code Playgroud)

我认为第二个版本导致膨胀的代码是没有充分理由的,最重要的是如果您最终必须拆分其他长成员函数,C::f以使代码更具可读性.

Thi*_*ilo 4

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

namespace {
    void C::h1() {/...}
    void C::h2() {/...}
    void C::h3() {/...}
}
Run Code Online (Sandbox Code Playgroud)

(参见这个问题

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

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

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