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

标签 c++ memory c++14 declaration definition

代码 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 的同一行中?为什么?

最佳答案

静态成员变量 instance代码1class Singleton中声明是一个类变量

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

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

关于c++ - 为什么我们需要定义一个类的静态变量,而函数内部却不定义静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68450957/

相关文章:

C++构造函数调用非虚函数,比如说funcA,但是funcA调用了虚函数,有危险吗

c++ - 如何为在 main() 外部和内部声明的变量分配内存

c++ - Lambda 捕获 : to use the initializer or not to use it?

C++11/14 : Wrap a function if it exists

c++ - Qt - 获取QPushButton图标名称

c++ - CMake configure 无法在 Linux 上找到 Qt5

c++ - 内存映射内存可能吗?

php postgres 从理论上讲从查询到获取行

c++ - 如何使用 C++14 和 C++1z 中的功能缩短此可变参数模板代码?

面对大项目的C++书籍推荐