写点什么

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

  • 2024-12-12
    福建
  • 本文字数:1100 字

    阅读完需:约 4 分钟

类外


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


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


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


类内


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


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


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


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


局部静态 local static


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


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


类外


以前,博主刷一些 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作为其他变量名,不仅会造成严重错误,且很难找到错误原因,特别对于大型项目)


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


#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();}
复制代码


类内


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


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


// 一个单例类(只存在一个实例,用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();}
复制代码


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


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方法外部定义这个单例。


文章转载自:miilue

原文链接:https://www.cnblogs.com/miilue-13/p/18600246

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
【C++】static 知识整理 【静态与局部静态】_c++_快乐非自愿限量之名_InfoQ写作社区