【C++】static 知识整理 【静态与局部静态】

目录

类外

C++的静态可以分为两种情况来讨论:在类外和在类内。

对于静态变量/函数,链接将只在内部 (如果不用static,那么在不同文件定义同名变量会报错)

声明定义在其他地方的变量需要使用extern,函数则不需要

类内

静态变量/方法将与类的所有实例共享内存 (若实例改变静态变量,那么会反应到这个类的所有实例)

静态方法无法访问类的实例和非静态变量(类中的每个非静态方法总是获得当前类的一个实例作为参数,而静态方法不会得到那个隐藏参数,其与在类外部编写方法相同)

类内的静态变量需要在类外声明:int Class::var;

以上有关静态的使用比较简单和常见,因此仅简单介绍,接下来我们看一个特殊一些的情况:局部静态

局部静态 local static

局部静态变量的生存期基本上相当于整个程序的生存期,而作用范围被限制。

(补充:变量的生存期:变量实际存在的时间(被删除之前);变量的作用域:可以访问变量的范围)

类外

以前,博主刷一些C++题的时候习会可能写出以下代码:

C++ 复制代码
#include<iostream>

int n = 0;

void Function() {
	n++;
	std::cout << n << std::endl;
}

int main() {
	for (int i = 0; i < 5; i++) {
		Function();
	}
	std::cin.get();
}

但是,这种全局定义是很危险的(假设你在其他地方也用了n作为其他变量名,不仅会造成严重错误,且很难找到错误原因,特别对于大型项目)

局部变量可以实现类似的效果的同时,避免设置全局变量:

C++ 复制代码
#include<iostream>

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

int main() {
	for (int i = 0; i < 5; i++) {
		Function();
	}
	std::cin.get();
}

类内

在类内利用局部静态可以使得代码更干净

先看一个没有使用局部静态的例子:

C++ 复制代码
// 一个单例类(只存在一个实例,用Get方法实现)
class Singleton {
private:
	static Singleton* s_Instance;
public:
	static Singleton& Get() { return *s_Instance; } // 返回引用
	
	void Hello() {}
};

Singleton* Singleton::s_Instance = nullptr;

int main() {
	Singleton::Get().Hello();
}

用局部静态实现相同功能:

C++ 复制代码
class Singleton {
public:
	static Singleton& Get() {
		static Singleton instance;
		return instance;
	}
	
	void Hello() {}
};

int main() {
	Singleton::Get().Hello();
}

如果Get方法中的static Singleton instance;没有static,那么这个单例instance会在栈上创建,运行到函数作用域结束即被销毁,然而返回的却是instance的引用,因此是一个严重的错误。

局部变量避免了在Get方法外部定义这个单例。

如文章有误或疏漏,欢迎评论指出

如有帮助,欢迎关注我的博客,后续也会更新其他的技术内容(坚持日更ing)
特别推荐 Cherno 的C++课程,可以去某管订阅他的频道,B站也有转载

相关推荐
ChoSeitaku42 分钟前
17.QT-Qt窗口-工具栏|状态栏|浮动窗口|设置停靠位置|设置浮动属性|设置移动属性|拉伸系数|添加控件(C++)
c++·qt·命令模式
软行2 小时前
LeetCode 每日一题 2845. 统计趣味子数组的数目
数据结构·c++·算法·leetcode
小贾要学习2 小时前
【C++】继承----下篇
android·java·c++
未来可期LJ2 小时前
【Test】单例模式❗
开发语言·c++
我想进大厂2 小时前
图论---染色法(判断是否为二分图)
数据结构·c++·算法·深度优先·图论
纪元A梦2 小时前
华为OD机试真题——推荐多样性(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
OpenC++4 小时前
【C++QT】Buttons 按钮控件详解
c++·经验分享·qt·leetcode·microsoft
YuforiaCode4 小时前
第十二届蓝桥杯 2021 C/C++组 直线
c语言·c++·蓝桥杯
草莓啵啵~5 小时前
搜索二叉树-key的搜索模型
数据结构·c++
共享家95275 小时前
深入理解C++ 中的list容器
c++