【C++】static 知识整理 【静态与局部静态】
类外
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
方法外部定义这个单例。
如文章有误或疏漏,欢迎评论指出
如有帮助,欢迎关注我的博客,后续也会更新其他的技术内容(坚持日更ing)
特别推荐 Cherno 的C++课程,可以去某管订阅他的频道,B站也有转载
【C++】static 知识整理 【静态与局部静态】的更多相关文章
- PHP static静态局部变量和静态全局变量总结
1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它.倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值 2.静态局部变量只会初始化一次 3.静态属 ...
- 值类型与引用类型(特殊的string) Typeof和GetType() 静态和非静态使用 参数传递 相关知识
学习大神博客链接: http://www.cnblogs.com/zhili/category/421637.html 一 值类型与引用类型 需要注意的string 是特殊类型的引用类型. 使用方法: ...
- C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别
局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序 ...
- C++ 局部静态变量,全局变量,全局静态变量,局部变量的区别和联系
C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全局变量只需在一个源文件 ...
- 自动对象&局部静态对象
一.关键点 对象的生命周期:程序执行过程中,该对象存在的那段时间 局部对象:形参.函数体内部定义的变量 二.自动对象 自动对象:只存在于块执行期间的对象 包括:局部变量.形参 三.局部静态对象 特点: ...
- c++ 反汇编 局部静态变量
vs2017下测试 34: for (int i = 0; i < 5; i++) 0029734E C7 45 F8 00 00 00 00 mov dword ptr [ebp-8],0 0 ...
- C#基础知识之静态和非静态
项目中静态和非静态常被用到,什么时候需要用静态的,什么时候需要使用非静态,以及他们的区别是什么? 一.概述 静态和非静态的不同地方,就是静态从程序一启动就会一直占用内存,而非静态只有在实例化的时候才会 ...
- C++中static修饰的静态成员函数、静态数据成员
1.静态成员函数.静态数据成员 在类中,用static修饰的成员函数被称为静态成员函数,而用static修饰的数据成员就称为静态数据成员:与普通的成员函数和数据成员不同, 静态成员函数和静态数据成员有 ...
- 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)
1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...
- Java基础知识整理之static修饰属性
static 关键字,我们在开发用的还是比较多的.在<Java编程思想>有下面一段话 static 方法就是没有 this 的方法.在 static 方法内部不能调用非静态方法,反过来是可 ...
随机推荐
- QT原理与源码分析之如何开发一个自定义的绘图设备和QT绘图引擎?
简介 本文将介绍如何自定义QT绘图设备类和如何自定义QT绘图引擎类. 目录 QT绘图设备抽象类QPaintDevice QT绘图引擎抽象类QPaintEngine 自定义绘图设备类 自定义绘图引擎类 ...
- T2 的莫反式子
正在实现,不知道对不对,但是先放这,哪个大佬发现问题了和我说下 设 \[f(l)=\sum\cdots\sum[\gcd=1,\text{lcm}=l] \] \[g(l)=\sum\cdots\su ...
- Dockerfile相关(推送镜像?私有仓库?)(九)
上面我们讲到了 Dockerfile 的基本写法以及构建镜像的时候一些注意事项,那么镜像构建完成后,如何把我们的镜像给到别人使用呢?第一种方法就是利用 Docker 官方提供的公共的 Docker H ...
- Nuxt.js 应用中的 page:start 钩子详解
title: Nuxt.js 应用中的 page:start 钩子详解 date: 2024/10/8 updated: 2024/10/8 author: cmdragon excerpt: pag ...
- 通过一个题目三种变式讲清楚go接口类型断言
[第一种]一种类型实现多个接口,各个接口变量调用各自的方法 type Work struct { i int } func (w Work) ShowA() int { return w.i + 10 ...
- CNN归纳偏好
出处:Transformer为何能闯入CV界秒杀CNN? CNN 中的卷积运算由于使用了两个重要的空间约束,从而有助于视觉特征的学习和提取: 由于 CNN 权重共享机制,卷积层所提取的特征便具有平移不 ...
- 多校A层冲刺NOIP2024模拟赛05
T1.好数(number) 签到题 把选三个数相加拆为选择一个数,然后看前面有没有能用两个数组合出答案. $ O(n^2) $ . 码( #include<bits/stdc++.h> u ...
- HOW MANY OF THEM?(让人匪夷所思的一题)
题面 由n个节点构成的,割边数不超过m条的无向连通图个数(无自环和重边),答案对1e9+7取模. \[------------------------------------------- \] 真是 ...
- 云原生爱好者周刊:寻找 Netlify 开源替代品
开源项目推荐 Coolify Coolify 是一个开源自托管的 Heroku/Netlify 替代品,颜值还不错. Podman Desktop Podman Desktop 是针对 Podman ...
- Spring中的事务提交事件
如果想在spring操作事务结束后执行一些代码,应该怎么办? 为什么要这样?比如我们在事务中给其他系统发了消息,期望事务提交后过一会收到这个系统的回应,然后操作刚刚提交的数据.但是如果回应来的太快就像 ...