为什么我们需要定义一个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
// ^^^^^^
你只需要给编译器一个警告。
代码 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
// ^^^^^^
你只需要给编译器一个警告。