私有静态方法是不是有必要?
Posted
技术标签:
【中文标题】私有静态方法是不是有必要?【英文标题】:Is there a Necessity for private static Methods?私有静态方法是否有必要? 【发布时间】:2017-06-17 07:30:07 【问题描述】:The Principle Engineer 在我上一家公司有一条规则,private
static
方法应该在实现文件中实现为函数,而不是类方法。
我不记得他的规则是否有任何例外。在我目前的工作中,我偶然发现了它的动机:如果相关函数的参数或返回类型是需要在标头中包含定义文件的对象,这可能会导致不必要的困难。 em>
这足以让我不再使用 private
static
方法,但在我注销它们之前,我想知道是否有人知道他们填补了实现文件函数不会填补的利基?
编辑:
这里有一个例子可能会有所帮助。假设这是 class Foo
声明的开始,它还有其他方法将在实现文件中调用 void foo()
:
class Foo
static void foo();
所以foo
只能通过Foo
的其他方法访问。我为什么不直接在实现文件中定义foo
,并把它放在头文件之外呢?
【问题讨论】:
@Downvoter 否决票有理由吗?显然,如果您只是对c++ 问题提供强制反对票,则无需回复。 那么,如果方法是public
或protected
,那会有什么不同呢?您的问题中引用的规则没有解释为什么 private
得到特殊处理。
@ChristianHackl 我从来没有听说过。我认为只有引用和指针可以前向声明。如果您愿意插话,我已要求在此跟进:***.com/q/41966731/2642059
@user2357112:您只需要在呼叫站点进行定义。见ideone.com/3yBY8R
@user2357112:但是你不需要函数declaration站点的类型定义。
【参考方案1】:
成员函数可以访问类的所有private
成员。如果一个函数需要访问这些成员,它应该是一个成员。无论是不是static
,这都适用。
static
函数是一种不对特定对象进行操作的函数。但是,它仍然可以接收对象作为参数。例如:
class A
int m;
static int process_3_objects_in_some_way(A x, A y, A z)
return x.m + y.m + z.m;
创建函数static
的另一个原因是参数的顺序。例如print
:
class A
int m;
static void print(std::ostream& stream, A x, int options)
stream << "Value is: " << (x.m * 1000000 + options);
【讨论】:
我猜你的第二个例子应该说x.m
而不是m
?不过很好的例子。
只是继续戳,因为这些是最好的例子,我希望我接受的答案至少是可编译的,我想你也想让print
返回一个ostream&
对吗?
是的,当然!这就是你没有通过编译器传递代码的结果,我猜......(为了简化,完全删除了返回值)【参考方案2】:
friend
在另一个实现文件中实现的函数或类是另一个需要私有静态成员函数的示例。
【讨论】:
friend
并不是我真正想要的,但我想这是该规则例外的一个公平示例。【参考方案3】:
与实现文件中的独立static
函数不同,私有静态成员函数可以在类头中使用。这在您想要内联调用私有静态函数的非私有成员函数的情况下很重要:
class Demo
private:
static std::string sanitize(const std::string& name);
std::string name;
public:
Demo(const std::string& n) : name(sanitize(n))
;
对独立静态函数执行相同操作需要在 cpp 文件中实现 Demo
的构造函数。
【讨论】:
这是一个很棒的例子。所以也许例外应该是:“当标题中不需要函数时。” @JonathanMee 是的,我在 C++ 时代就遵循了这条规则。像“更喜欢独立的静态函数和静态变量而不是静态成员函数和静态成员变量,除非你需要在类的标题中使用它们。” 这比我的笨拙说得好,我的问题的无数澄清清楚地证明了这一点。 你不能在类之前在头文件中转发声明静态/独立方法吗?那仍然应该允许在标题中实现构造函数内联。 ...虽然一个独立的方法添加到类外的命名空间。私有静态方法不会污染全局命名空间。以上是关于私有静态方法是不是有必要?的主要内容,如果未能解决你的问题,请参考以下文章