是否需要私有静态方法?
Is there a Necessity for private static Methods?
The Principle Engineer 在我上一家公司有一条规则,即 private
static
方法应该作为实现文件中的函数来实现,而不是作为 class 方法。
我不记得他的规则是否有例外。我在目前的工作中偶然发现了它的动机:如果相关函数的参数或 return 类型是 objects,则需要在header,这会造成不必要的困难。
这足以让我不再使用 private
static
方法,但在我注销它们之前,我想知道是否有人知道他们填补了一个实现的利基市场文件功能不会?
编辑:
这里举个例子可能会有帮助。假设这是 class Foo
声明的开始,它有其他方法将在实现文件中调用 void foo()
:
class Foo {
static void foo();
所以foo
只能通过Foo
的其他方法访问。为什么我不直接在实现文件中定义 foo
,并将其放在 header 之外?
不同于free-standing static
函数在实现文件中,私有静态成员函数可以在class 的头部使用。这在你想要内联一个 non-private 成员函数的情况下很重要,它调用你的私有静态函数:
class Demo {
private:
static std::string sanitize(const std::string& name);
std::string name;
public:
Demo(const std::string& n) : name(sanitize(n)) {
}
};
对 free-standing 静态函数执行相同操作需要在 cpp 文件中实现 Demo
的构造函数。
在另一个实现文件中实现的 friend
函数或 类 是另一个需要私有静态成员函数的示例。
成员函数可以访问 class 的所有 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);
}
}
The Principle Engineer 在我上一家公司有一条规则,即 private
static
方法应该作为实现文件中的函数来实现,而不是作为 class 方法。
我不记得他的规则是否有例外。我在目前的工作中偶然发现了它的动机:如果相关函数的参数或 return 类型是 objects,则需要在header,这会造成不必要的困难。
这足以让我不再使用 private
static
方法,但在我注销它们之前,我想知道是否有人知道他们填补了一个实现的利基市场文件功能不会?
编辑:
这里举个例子可能会有帮助。假设这是 class Foo
声明的开始,它有其他方法将在实现文件中调用 void foo()
:
class Foo {
static void foo();
所以foo
只能通过Foo
的其他方法访问。为什么我不直接在实现文件中定义 foo
,并将其放在 header 之外?
不同于free-standing static
函数在实现文件中,私有静态成员函数可以在class 的头部使用。这在你想要内联一个 non-private 成员函数的情况下很重要,它调用你的私有静态函数:
class Demo {
private:
static std::string sanitize(const std::string& name);
std::string name;
public:
Demo(const std::string& n) : name(sanitize(n)) {
}
};
对 free-standing 静态函数执行相同操作需要在 cpp 文件中实现 Demo
的构造函数。
friend
函数或 类 是另一个需要私有静态成员函数的示例。
成员函数可以访问 class 的所有 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);
}
}