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

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

当我们可以使用普通函数修改静态数据成员时,还需要静态成员函数吗?我对静态成员函数的需求感到困惑。请帮我澄清一下...

static 表示(在 class 的上下文中)您始终可以调用 ClassName::MethodName() 之类的方法,而不是 ClassName instance; instance.MethodName.

意思是——你可以从非静态成员函数调用静态成员函数,但反过来不行,因为静态成员函数不拥有一个或多个 class.

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

的所有内部结构是可以的

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

无需创建 class 的任何对象即可调用静态函数。
例如
假设您有一条包含房屋数量的 class 街道和一个将房屋数量递增 1 的静态方法 addHouse()。
你想创建一个新房子,所以你可以在 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.
    }

};

What is the need of static member functions

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

when we can modify the static data members by using normal functions?

不是所有的时间!除非先实例化一个对象,否则不能从非静态成员函数修改静态数据成员。另一方面,无论是否实例化对象,您始终可以从静态成员函数执行此操作。

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

静态方法将使编译器确保它只与静态数据混淆。它还使它更清楚,因为当您看到静态方法时,您知道它不需要任何 'alive' 对象数据。