为什么我们需要定义一个class的静态变量,而在函数内部却不定义静态变量?

Why do we need to define static variables of a class, but we don't define static variables when they are inside functions?

代码 1:

#include<iostream>

class Singleton
{
private:
    static Singleton instance; //declaration of static variable

public:
    static Singleton &GetInstance()
    {
        return instance;
    }
    void Hello()
    {
        std::cout << "Hello!";
    }
};

Singleton Singleton::instance; //definition of static variable

int main()
{
    Singleton::GetInstance().Hello();
}

代码 2:

#include <iostream>

class Singleton
{
public:
    static Singleton &GetInstance()
    {
        static Singleton instance; //declaration of static variable
        return instance;
    }
    void Hello()
    {
        std::cout << "Hello!";
    }
};

int main()
{
    Singleton::GetInstance().Hello();
}

在代码1中我们需要定义静态变量,而在代码2中,我们只是在函数Singleton::GetInstance&()中声明静态变量然后返回它。声明和定义是否发生在代码 2 的同一行中?为什么?

对于 classes 静态变量存储得很好...静态的,因此它们可以在 class 的每个实例之间访问。就像在 classes 之间可以访问相同的变量。请参阅 https://en.wikipedia.org/wiki/Static_variable 了解它们是什么。在函数中,将它们定义为 static 没有多大意义,因为函数无法在其外部访问。

在 classes 中,您不需要将它们定义为静态。但在这种情况下,使用单例很好,因为它确保程序中的所有内容都在一个实例中工作,按照单例设计。 (不保证线程安全)

此外,静态函数根本不需要 运行 的构造函数,因此它们作为简单函数工作。他们不保证您使用相同的数据。

static member 变量 instance 代码 1[ 的 class Singleton 中声明 class Singleton =29=] 是一个 class 变量.

这意味着无论 class Singleton 的不同实例的状态如何,对于该特定 class 的所有 objects/instances,静态变量的状态将保持不变。因此,它需要在 class 之外定义。 (就像可用于所有作用域的全局变量一样。)。即使您不创建任何实例,也会在内存中分配静态成员变量的单个副本。它们的定义贯穿整个文件。

代码 2 中,静态变量 instance 不是 class 变量 而只是一个静态成员函数内的局部变量。因此不需要在外部定义它,因为它的范围仅限于 static Singleton &GetInstance() 函数。

[编辑:这个答案早于问题上的 C++14 标签;它假定 C++17 或 C++20]

假设错误:

class Singleton
{
private:
    static inline Singleton instance; //definition of static variable
    //     ^^^^^^

你只需要给编译器一个警告。