2016-08-03 83 views
0

我给下面的代码来说明我的问题:如果类中没有保持类的状态的变量,函数应该声明为静态函数?

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

}; 

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

}; 

两个类AbcDef不变量来之类的状态。在这种情况下,定义功能do_something哪种方式更好?将它作为静态函数更好?

+6

如何使它成为非会员功能? –

+3

如果你有所有的静态函数,为什么不使用命名空间? –

+1

如果你没有任何字段,你可能不需要这个类。如果你正在做一些与类对象相关的事情,那么静态函数是适当的。你可能不会有这些类的对象。 –

回答

-2

static功能用于

  1. 调用类本身(而不是类的实例)
  2. 扩展函数能见度同一翻译单元

回答你的问题,在“ Abs'的情况更为可取。

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

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

如果方法应用于类而不是类的实例,则可以使用静态方法(别的称为“类方法”,这是一个更好的词)。如果要创建作为该类实例的对象,则使用实例方法。

由于您甚至没有提及您应该使用的标准,因此您的案例中没有人会告诉您哪种更好。另一方面,如果你正在谈论“班级地位”(这是人们不经常谈论的事情),似乎表明你应该使用类方法或单例。

3

它完全取决于你的课堂设计和这些功能的目的。 例如,如果你想跟着open-closed principle你可能要问自己一个问题:

“难道我想允许扩展(即派生类)以这样的方式,他们将成为有状态的扩展这些功能的行为(即取决于一些不是在这些派生类中添加的静态成员)?“

根据您的设计,答案可能是“是”或“否”(这意味着这些函数根据其原始目的定义是无状态的)。请注意,如果您还想允许dynamic polymorphism,则不仅需要使这些功能不是静态的,而且还要使它们变为虚拟。

所以,要回答这个问题,你首先需要仔细设计你的班级。给出设计决定的答案将变得更具体。

1

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

void do_something() {...} 

而且它会更容易调用,只是do_something()就是这样。

如果该功能需要在memeber类的变量进行操作,那么它应该是一个正常的成员函数,在这种情况下,您从一个实例调用它:

ABC a; 
a.do_something() 

静态方法,而另一方面,是一种使代码更加组织化的方法,在具有完整功能类的成员变量和成员函数对其起作用的特定情况下,还需要一个或多个与特定实例无关的函数变量状态根本不存在,但是以合乎逻辑的方式与班级相关。也就是说,你可以在不附加到类的情况下编写函数。例如,如果您需要一个创建类的特定实例的函数,例如使用特定的构造函数参数组合,否则每次调用都会很麻烦,您可以将其编写为独立函数,它通过调用具有参数组合的构造函数来创建并返回该类的一个实例。但明确地将其与班级联系起来更合理。在这种情况下,您可以将其设为静态成员函数。