0
点赞
收藏
分享

微信扫一扫

Cherno C++ P48 C++中的局部静态(Local static)

朱小落 2022-01-21 阅读 31

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,它实际上会构造一个单例实例,接下来的时间只会返回这个已经存在的实例。

举报

相关推荐

0 条评论