Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 助手的静态自由函数还是成员函数?_C++ - Fatal编程技术网

C++ 助手的静态自由函数还是成员函数?

C++ 助手的静态自由函数还是成员函数?,c++,C++,假设您具有以下非静态成员函数: // .h struct C { void f(); } 现在假设您想通过使用一些特定于C::f的子函数来实现C::f,以使其更短、更可读;例如: // .cpp void C::f() { h1(); h2(); //... hn(); } 假设其中许多h()函数不需要访问任何数据成员。这意味着您可以将函数定义为静态自由函数(在one.cpp中)或成员函数(静态或非静态) 你会让它们成为无静态函数还是C的函数成员 第一

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

// .h
struct C {
    void f();
}
现在假设您想通过使用一些特定于
C::f
的子函数来实现
C::f
,以使其更短、更可读;例如:

// .cpp
void C::f() {
    h1();
    h2();
    //...
    hn();
}
假设其中许多h()函数不需要访问任何数据成员。这意味着您可以将函数定义为静态自由函数(在one.cpp中)或成员函数(静态或非静态)

你会让它们成为无静态函数还是C的函数成员

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

// .cpp
static void h1() {//...}
static void h2() {//...}
static void hn() {//...}
另外,如果我没有错的话,也没有全局名称空间污染的风险,因为它们是静态的,也就是说,它们只能从同一个unit.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
,以使代码更具可读性。

只有您才能回答这个问题。如果它们永远不会在
C::f
之外使用,那么就没有必要污染全局名称空间。我个人会让他们成为
C
的成员函数。如果可以将它们标记为静态,那么就这样做,但如果它们真的只对
f
重要,那么就给它们命名一些表示这一点的名称,不要担心
static
我建议使用匿名名称空间:

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

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

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


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

我会将它们设置为非静态的,但位于匿名名称空间中,而不是静态的自由函数或成员函数。为什么不创建一个封装帮助器的函数对象,或者将帮助器放置在源文件中的匿名名称空间中?好,但是在我提到的第一个选项中没有污染全局名称空间的风险,因为h()是静态的,它是单个.cpp文件的本地文件,它们将在其中分组。但是您确定自由静态函数会影响全局名称空间吗?静态自由函数不是只定义在.cpp文件中的本地函数吗?是的,你的权利就是这样<代码>静态再次抓住我。但是,看看为什么选择匿名名称空间仍然很好,它不再那么重要了。已删除对C++11的弃用,请参阅