如果类中没有保持类状态的变量,那么函数应该声明为静态函数?

时间:2016-08-03 07:44:02

标签: c++

我提供以下代码来说明我的问题:

class Abc
{
  public:
       void do_something() {};

};

class Def
{
 public:
      static void do_something() {};

};

AbcDef都没有变量来保持类的状态。在这种情况下,定义函数do_something的方式更好?将它作为静态函数更好吗?

4 个答案:

答案 0 :(得分:5)

不,你完全错了。是否有任何实例变量保持状态是一个实现细节,您不应该在界面设计中关心。

如果方法适用于类,而不是类的实例,则使用静态方法(在其他地方称为"类方法",这是一个更好的词)。如果要创建作为类实例的对象,则使用实例方法。

由于你甚至没有提到你应该使用的标准,没有人可以告诉你在你的情况下什么是更好的。另一方面,如果你在谈论"班级的状态" (这是人们经常谈论的事情)似乎表明你应该使用类方法或单例。

答案 1 :(得分:3)

这完全取决于你的班级设计和这些功能的目的。 例如,如果您想关注open-closed principle,您可能想问自己一个问题:

"我是否希望允许扩展(即派生类)以这样的方式扩展这些函数的行为,即它们将变为有状态(即依赖于某些非某些派生类中添加的静态成员) ?"

根据您的设计,答案可能是"是"或"不" (这意味着这些函数的初始目的定义是无状态的)。请注意,如果您还希望同时允许dynamic polymorphism,则不仅要让这些功能不是静态的,还要使它们成为虚拟功能。

所以,要回答这个问题,首先需要仔细设计你的课程。鉴于设计决策,答案将变得更加具体。

答案 2 :(得分:1)

如果您需要的唯一功能是do_something(),而没有该类中的任何其他字段,那么最佳方式IMO根本就没有类。简单地定义

void do_something() {...}

更容易打电话,只需do_something()即可。

如果函数需要对类的memeber变量进行操作,那么它应该是一个普通的成员函数,在这种情况下你可以从一个实例调用它:

ABC a;
a.do_something()
另一方面,静态方法是一种使代码更有条理的方法,在特定情况下,如果你有一个功能完整的类,其中包含成员变量和成员函数,但你也需要一个或多个不与实例特定变量相关的函数,但是以逻辑方式与类相关。也就是说,你可以编写的函数,而不必依赖于类。

例如,如果你需要一个创建类的特定实例的函数,比如使用构造函数参数的特定组合,否则每次调用会很麻烦,你可以把它写成一个独立的函数,通过使用参数组合调用构造函数来创建并返回类的实例。但是,将它与阶级明确地联系在一起会更加合理。在这种情况下,您可以将其设为静态成员函数。

答案 3 :(得分:-2)

static函数用于

  1. 调用类本身(不是类的实例)
  2. 将功能可见性传播到同一个翻译单元
  3. 回答你的问题,'Abs'案例更为可取。

    1. 如果类具有内部非静态状态变量,则无法为静态函数访问它们。静态函数只能访问静态变量。
    2. 也不可能从静态函数调用普通的非静态类函数。
    3. 无法生成工厂功能等。无法使用new调用private / protected构造函数创建实例。