我发现很难决定何时使用私有静态成员函数以及何时使用私有const成员函数。
让我们说我们有一个方法DoSomething()需要检查一个或多个成员是否是某个东西:
{{1}}
当一个辅助函数只能以一种方式使用时(比如只检查a_是否是某种东西),我倾向于使用const成员函数。如果它将与几个参数一起使用,我倾向于坚持使用静态版本。还有其他因素我没想到会说服我选择不同的方式吗?
编辑:我认为我解释得很差,所以我在示例中添加了定义。
答案 0 :(得分:4)
我倾向于在可能的情况下在未命名的命名空间中使用自由函数。
之间
// header
class A
{
public:
bool HasCustomProperty() const();
private:
bool IsOdd() const;
bool IsHappy() const;
private:
int a;
};
// cpp
bool A::HasCustomProperty() const
{
return IsOdd() && IsHappy();
}
和
// header
class A
{
public:
bool HasCustomProperty() const();
private:
static bool IsOdd(int n);
static bool IsHappy(int n);
private:
int a;
};
// cpp
bool A::HasCustomProperty() const
{
return IsOdd(a) && IsHappy(a);
}
和
// header
class A
{
public:
bool HasCustomProperty() const();
private:
int a;
};
// cpp
namespace {
bool IsOdd(int n);
bool IsHappy(int n);
}
bool A::HasCustomProperty() const
{
return IsOdd(a) && IsHappy(a);
}
我选择了最后一个。
答案 1 :(得分:3)
const
的标记除外] mutable
。
static
表示“此函数没有传递给函数的隐藏this
指针”,所以就像任何不属于该类的自由函数一样,除了它的类型在课堂上“命名空间”。
他们完全和完全不同的“动物”。
编辑:它真正归结为对类/系统设计最有意义的东西。将static
函数用于实际上不属于类的事物通常是正确的。我很少使用static
函数,因为除了在一些非常特殊的情况下它们没什么意义 - 这里要问的问题是,“如果我将它设为静态,为什么它仍然是这个类的一部分?”,如果答案是“因为它属于类”,那么它应该是static
函数。另一方面,如果答案不是一个可靠的原因,那么它可能不属于类,并且最终应该作为源文件中的静态自由函数(可能在匿名命名空间中)而不是在类中
在我的编译器项目中(共有大约13000行C ++代码),我有一个static
成员函数(将字符串转换为令牌类中的关键字令牌 - 因为它在构造过程中被调用)令牌本身,因此不适合作为成员函数)。我在.cpp文件中有大约50个静态函数,它们不是成员函数。对于某些表达式,这些做IsConstant()
之类的事情[不,我不希望它作为表达式本身的成员函数,因为这是一个可以表达很多东西的泛型类,这意味着我会必须有几十个return false
虚函数的实现,对于一个相对罕见的情况],错误函数(打印错误消息)等。可以让它们成为静态成员,但是类的用户不需要使用这些函数,这意味着将它们暴露给外部是没有意义的。
答案 2 :(得分:2)
static
函数不能使用任何非静态成员函数或变量。
static
函数无法以多态方式覆盖。
您可以使用static
函数的地址。
您不需要班级实例来调用static
函数。
标记为const
的成员函数,可访问类成员,调用其他const
函数,和如果已标记,则会多态重写virtual
。
答案 3 :(得分:1)
它们是两个不同的东西而不是替代品:
const成员函数不允许修改类即时数据。 静态成员函数没有关联的类实例。
使用OP的示例类定义然后在inplementstion ...
bool Foo::IsSomething(int* n)
{
return *n < *a_; // not ok. static method has no this
}
bool Foo::IsASomething() const
{
return (*a_ > 8) // ok as member a_ not changed
}
bool Foo::IsASomething() const
{
*a_ +=4; // not ok as a_ cannot be changed by const member
return (*a_ > 8);
}