static vs const成员函数

时间:2015-07-31 08:00:01

标签: c++

我发现很难决定何时使用私有静态成员函数以及何时使用私有const成员函数。

让我们说我们有一个方法DoSomething()需要检查一个或多个成员是否是某个东西:

{{1}}

当一个辅助函数只能以一种方式使用时(比如只检查a_是否是某种东西),我倾向于使用const成员函数。如果它将与几个参数一起使用,我倾向于坚持使用静态版本。还有其他因素我没想到会说服我选择不同的方式吗?

编辑:我认为我解释得很差,所以我在示例中添加了定义。

4 个答案:

答案 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)

  1. static函数不能使用任何非静态成员函数或变量。

  2. static函数无法以多态方式覆盖。

  3. 您可以使用static函数的地址

  4. 您不需要班级实例来调用static函数。

  5. 标记为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);
}