C++中的局部静态(Local static)
YouTube视频链接
本文是ChernoP48视频的学习笔记。
我们可以在局部作用域中使用static来声明一个变量。声明一个变量我们需要考虑两种情况,一个是变量的生存期,另一个是变量的作用域。生存期指的是变量实际存在的时间(在内存中存多久),而变量的作用域是指我们可以访问变量的范围。
静态局部(Local static)变量允许我们声明一个变量,它的生存周期基本相当于整个程序的生存期,但是作用范围被限制在作用域内。
看如下Main.cpp代码,会输出5个1。
#include<iostream>
void Func()
{
int i = 0;
i++;
std::cout << i << std::endl;
}
int main()
{
Func();
Func();
Func();
Func();
Func();
std::cin.get();
}
若我们在局部作用域中声明为static,被标记为static的变量i生存周期基本和程序相同,并且它被限制在了Func()中。
不使用局部静态创建单例类
单例类是只存在一个实例的类,我们可以创建这个单例类而不使用静态局部作用域。我需要先创建静态的单例实例,这里是一个指针。为了返回引用必须有一个返回Singleton&的Get函数,它是静态的,然后返回我的实例,这里要放上逆向引用符号*。然后需要声明这个实例,可以把它默认设为空指针。这样我就可以调用Singleton::Get。
#include<iostream>
class Singleton
{
private:
static Singleton* s_Instance;
public:
static Singleton& Get() { return *s_Instance; };
void Hello()
{
std::cout << "Hello" << std::endl;
}
};
Singleton* Singleton::s_Instance = nullptr;
int main()
{
Singleton::Get().Hello();
std::cin.get();
}
使用局部静态创建单例类
我们先去掉静态的单例实例,然后去掉实例的外部定义,然后我们可以扩展Get函数来创建static Singleton的实例,然后返回该实例。
如果这里没有static关键字,那么这个单例会在栈上创建,函数作用域结束时就会被销毁。通过添加静态让它的生存期延长到永远。意味着我们每次调用Get,它实际上会构造一个单例实例,接下来的时间只会返回这个已经存在的实例。