当我们可以使用普通函数修改静态数据成员时,静态成员函数的需求是什么?

What is the need of static member functions when we can modify the static data members by using normal functions?

本文关键字:函数 静态成员 是什么 需求 数据成员 静态 可以使 我们 修改      更新时间:2023-10-16

当可以使用普通函数修改静态数据成员时,还需要静态成员函数吗?我对静态成员函数的需要感到困惑。

有两个原因:一个是技术上的,另一个是关于代码的可读性。技术方面很简单:静态方法仍然是类的方法,因此它可以访问它的私有成员。它是类的一部分,知道类的所有内部信息是可以的。

但更重要的是类是名称空间。它们构建你的代码。通过使用静态方法,您可以告诉每个人它属于类并且与类紧密相关。

静态成员函数的必要性

你需要将类的成员函数声明为静态,以便能够在不实例化对象的情况下调用它。例如,查找Singleton模式

何时可以使用普通函数修改静态数据成员?

并非总是如此!除非先实例化一个对象,否则不能从非静态成员函数修改静态数据成员。另一方面,无论是否实例化了对象,都可以从静态成员函数中实现。

static意味着(在类的上下文中)您总是可以像调用ClassName::MethodName()而不是ClassName instance; instance.MethodName那样调用方法。

意味着-你可以从非静态成员函数调用静态成员函数,但不能反过来,因为静态成员函数不拥有一个或多个类的实例。

无需创建类的任何对象即可调用静态函数。
如。
假设你有一个包含房屋数量的Street类和一个静态方法addHouse(),它将房屋数量增加1。
如果您想创建一个新房子,那么只需在house的构造函数中调用addHouse()即可。如果您创建了非静态成员,那么每次为House创建对象时都必须创建Street的新对象。

class Street
{
    static int numberOfHouses = 0;
public:
    static void addHouse()
    {
        numberOfHouses ++;
    }
    void incrementHouse()
    {
        numberOfHouses++;
    }

};
class House
{
public:
    House()
    {
        Street::addHouse();
        //this will not create a new object for Street
        Street s;
        s.incrementHouse();
        // you would have to allocate memory for extra object of street class for this.
    }
};

类中的静态意味着数据不属于所创建的对象,而是属于类本身。所有对象的数据都是相同的(不相等,但地址相同)。

静态方法将使编译器确保它只处理静态数据。它也使它更清晰,因为当你看到一个静态方法时,你知道它不需要任何"活动"对象数据。