我提供以下代码来说明我的问题:
class Abc
{
public:
void do_something() {};
};
class Def
{
public:
static void do_something() {};
};
类Abc
和Def
都没有变量来保持类的状态。在这种情况下,定义函数do_something
的方式更好?将它作为静态函数更好吗?
答案 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
函数用于
回答你的问题,'Abs'案例更为可取。
new
调用private
/ protected
构造函数创建实例。