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的弃用,请参阅