当前位置: 首页 > article >正文

C++_CH16_Local static

C++_CH16_Local static

用static标注,使得变量成为局部变量

变量是有作用域的,比如函数可以是一个变量的作用域。能在整个工程使用的变量叫全局变量,其余的叫局部变量。举个例子

#include<iostream>

void printf()
{
	int i = 0;
	i++;
	std::cout<<i<<std::endl;
}

int main()
{
	printf();
	printf();
	printf();
	printf();
	printf();
	
	std::cin.get();

}

output:

1
1
1
1
1

这是因为,每次调用printf(),i的值都被重新更改为了0。

1.2 解决方法

把int i = 0写在函数外面来

#include<iostream>

int i = 0;
void printf()
{
	i++;
	std::cout<<i<<std::endl;
}

int main()
{
	printf();
	printf();
	printf();
	printf();
	printf();
	
	std::cin.get();

}

output:

1
2
3
4
5

但是这个方法有个问题。一旦我们在main函数中对i进行修改,会改变局势的走向:(因为我们可以在任意位置访问i)

#include<iostream>

int i = 0;
void printf()
{
	i++;
	std::cout<<i<<std::endl;
}

int main()
{
	printf();
	printf();
	i = 10;
	printf();
	printf();
	printf();
	
	std::cin.get();

}

output:

1
2
11
12
13

因此有了方法2:

#include<iostream>

void printf()
{
	static int i = 0;
	i++;
	std::cout<<i<<std::endl;
}

int main()
{
	printf();
	printf();
	printf();
	printf();
	printf();
	
	std::cin.get();

}

output:

1
2	
3
4
5

如果在任意位置修改i,则会报错。加上static后,重新调用一次函数,不会把i的值归0。

1.3 局部静态让代码更简洁

比如我要编写一个类:

#include<iostream>

class Singleton
{
private:	
    static Singleton* s_instance;
    // 私有构造函数,防止外部创建实例
    Singleton() {}

public:
    // 延迟初始化单例对象
    static Singleton& Get(){
        if (s_instance == nullptr) {
            s_instance = new Singleton();
        }
        return *s_instance;
    }
    
    void hello()
    {
        std::cout<<"Hello"<<std::endl;
    }
};

// 静态成员的初始化
Singleton* Singleton::s_instance = nullptr;

int main()
{
    Singleton::Get().hello();
    std::cin.get();
    return 0;
}

就可以直接这样写:

#include<iostream>

class Singleton
{
public:	
	static  Singleton& Get()
	{
		static Singleton instance;
		return instance;
	}
    
    void hello()
    {
        std::cout<<"Hello"<<std::endl;
    }
};

int main()
{
    Singleton::Get().hello();
    std::cin.get();
    return 0;
}

output:

Hello

http://www.kler.cn/a/282810.html

相关文章:

  • Python知识点:如何使用PostgreSQL与Psycopg2进行数据库操作
  • 查找3(红黑树、B树)
  • VC++内存泄漏检测方法(6):介绍deleaker和heob两款软件
  • OpenCV杂项图像变换(2)线性混合函数blendLinear()的使用
  • 触想强固型工业显示器加速海上油气勘探开发
  • GIT版本控制与协同开发
  • pnpm快速入门
  • [000-01-008].第01节:Consul环境搭建
  • 【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题
  • 从零开始掌握Vue实例
  • 7,sql 基本的创建库表查询数据
  • 设计模式-抽象工厂 abstract_factory
  • 【网络安全】漏洞挖掘
  • springboot启动很慢,加载xml时卡住 或者 {dataSource-1} inited卡住 或者 primary数据库配置错误,很久启动不起来
  • 美颜相机java
  • C# 以管理员方式启动
  • 注册免费的vps:infinityfree
  • Spring MVC概述
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • 搭建自己的金融数据源和量化分析平台(八):解析PDF财报中的资产负债表