4

如果每个成员函数每个类只包含一次(由所有实例共享),那么声明成员函数静态的目的到底是什么?它是否像一个被声明为 const 的函数,因为它修改了特定类型的数据(在这种情况下,是静态数据成员)?

4

3 回答 3

5

普通成员函数需要类实例才能运行。可以直接调用静态方法,而无需先创建类的实例。

普通方法:

MyClass myClass;
myClass.NormalMethod();

静态方法:

MyClass::StaticMethod();

因此,普通方法非常适合处理类数据的函数。如果一个方法不需要处理类数据,那么它可能会成为静态的候选方法。

于 2012-12-09T19:21:33.613 回答
2

类方法,无论是静态的还是其他的,都可以访问该类的任何对象的私有成员,而不仅仅是它自己的实例。静态方法也是如此,除非您将实例传递给它们,否则它们没有实例。

您也可以使用自由函数并将其声明为友元,但自由函数意味着更高级别的抽象,可以对不同类的对象进行操作。静态类方法说“我只根据我的类才有意义”

于 2012-12-09T19:27:27.067 回答
0

静态方法的一种应用是创建实例并返回指针。例如,可能存在调用者不应该知道的派生类——“工厂”函数知道要使用哪个派生类。

当然,当您需要创建一个对象时,您可能还没有一个对象可用于此,即使您这样做了,其他对象也不相关。

基本上,有时某些动作是类提供的抽象的一个方面,但该动作与特定对象无关 - 或者至少不是已经存在的对象。在这种情况下,您应该将操作实现为静态函数。

类似地,一些数据与类提供的抽象相关,但与该类的特定实例无关。该数据可能最好作为静态成员变量来实现。

于 2012-12-09T20:08:59.247 回答