微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我们需要定义类的静态变量,而在函数内部不定义静态变量呢?

如何解决为什么我们需要定义类的静态变量,而在函数内部不定义静态变量呢?

代码 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代码1中的class Singleton内声明是一个类变量

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

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

,

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

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

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

,

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

假设是错误的:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。