C++静态持续变量介绍
目录
- 1、auto关键字
- 2、静态持续变量
1、auto关键字
我们现在知道,使用auto
关键字可以自动推导变量类型,尤其是在一些很复杂的情况下,使用auto
可以大大简化代码。但是在早期的C++
和C语言当中,auto
关键字被用来显式地表示某个变量为自动存储。
auto float dis;
这个功能几乎不被使用,所以在C++11当中进行了更新,赋予了它新的含义。
2、静态持续变量
除了自动存储变量之后,C++当中还有静态持续变量。关于静态持续变量的定义C++和C语言是一样的,它拥有三种链接性,即外部链接性、内部连接性和无链接性。其中外部链接性指的是可以在其他文件中访问,内部链接性指的是只能在当前文件访问,无链接性指的是只能在当前函数或代码块中访问。
这三种链接性虽然范围不同,但都在整个程序运行期间存在,因此它们的寿命更长,由于在程序运行期间,静态持续变量的数目保持不变,因此不需要使用栈来管理它们。编译器将会分配固定的内存块来存储所有的静态变量,这些变量在整个程序运行期间一直存在。
并且所有没有显式初始化的静态变量,编译器都会将它置为0。在默认情况下,静态数组和结构将所有元素和成员的所有位都置为0。
下面介绍一下这三种静态持续变量的创建方法:
int cnt = 1000; static int one_file = 50; void func1(int n) { static int ret = 0; } int main() { // some statements }
在上面这段代码当中,我们定义了三个静态持续变量:cnt
,one_file
,ret
。其中cnt
为外部链接性,它可以在任何地方使用。one_file
为内部链接性,可以在当前文件中任意地方使用。而ret没有链接性,只能在函数func1
中使用。
但是这里有一点要注意,虽然ret只能在函数func1
中使用,但这并不意味着函数func1
执行之前ret不存在。前面说了静态持续变量拥有单独的内存块来存储,并不受函数生命周期的影响。
我们来看一个例子:
void test() { static int ret = 0; ret++; cout << ret << endl; } int main() { test(); test(); return 0; }
请问当我们运行上述代码,屏幕当中会得到什么结果?
答案是1和2,因为ret变量是一个静态持续类型,虽然我们只能在函数test
内部使用它,但它不受函数test生命周期的影响。也就是说static int ret = 0
;这句初始化语句只会在test函数第一次执行时执行一次,之后即使函数退出,这个值依然存在。当我们第二次执行的时候,由于ret变量已经存在,所以并不会将它再置为0。
对于这里用到的关键字static,简单理解成静态是不妥的。其实它有两层含义,当我们是在一个函数内部局部声明的时候,它表示的是这个变量是一个无链接性的静态变量,表示的是存储的持续性。当用于代码块外部声明时,static表示的是内部链接性,如果不加static
则表示外部链接性。所以这其中的作用是有一点区别的,也有人将它称为关键字重载,即关键字的具体含义取决于上下文。
到此这篇关于 C++静态持续变量介绍的文章就介绍到这了,更多相关 C++静态持续变量内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C++静态变量,常量的存储位置你真的了解吗
目录 引言 C++对内存的划分如何落实在Linux上 自由存储区和堆之间的问题 栈 常量区 静态存储区 静态局部变量 静态局部变量.静态全局变量.全局变量的异同 总结 引言 在动态内存的博客中,我提到: 在Linux 内存管理的博客中,我提到: 尽管都有尽可能完全的描述,并且两者大致意思没有冲突.而之所以令我一直感到略有不同,越看越迷糊的原因是:第一张图讲的其实是C++在概念上对内存的划分,第二张图讲的是Linux对虚拟内存进行的划分. 前者是概念上的,也是C++程序在运行时会切实执行的,而后者
-
C++静态链接与动态链接详解
目录 一.GCC工作流程 二.静态链接与动态链接 1.静态链接 2.动态链接 总结 一.GCC工作流程 预处理:把#头文件展开,进行宏替换,去掉注释(生成.i文件) 编译:把预处理后的文件生成汇编文件(.s文件),主要是检查语法.语义问题 汇编:把汇编文件生成目标文件(.o文件) 链接:将函数库中相应的代码组合到目标文件,生成可执行文件(默认a.out文件) o文件不会立即执行,因为可能出现:一个.cpp文件中的函数引用了另一个.cpp文件中定义的符号/调用了某个库文件中的函数.链接的目的就是将
-
用Visual Studio2017写C++静态库图文详解
造轮子是一件有趣的事情,VS是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好Orz).这里就展示一下构建一个简单的静态库的正确姿势.(顺便教一点道理 创建解决方案--许多人搞不清工程/项目Project和解决方案Solution的区别,在VS中,Project是基本的执行单元,一个Solution可以包含多个Project--我们的静态库就将会包含几个(.lib)Project和一个(.exe)Project用作测试.解决方案选
-
C++静态成员变量和静态成员函数的使用方法总结
一.静态成员变量: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则.同时,静态数据成员还具有以下特点: 1.静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义(初始化)不应该被放在头文件中. 其定义方式与全局变量相同.举例如下: xxx.h文件 class base{ private: static const int _i;//
-
VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码
1. 静态库和动态库 1.1. 静态链接库 举个例子,假如你在编写一个C++工程,根据业务逻辑,这个工程需要用到一些工具类,例如集合操作的工具类(暂且叫他collection_utils),于是你直接定义一个collection_utils.h头文件和一个collection_utils.cpp文件,在头文件中写一些工具函数的定义,在cpp文件中写函数的实现逻辑:如下所示: //---------------collection_utils.h--------------------------
-
解决在Mac下直接解压C++静态库出现的问题
发现问题 C++的静态库(*.a文件)就是一个压缩包,把所有 *.o 文件打包在里面. 所以我想尝试做的事很简单:就是把静态库里的 *.o 文件都解压出来,然后在用这些 *.o 文件链接合并为一个动态库.我直接双击解压的,这样就得到了一堆的 *.o 文件.然后我执行了生成动态库的命令,类似如下: c++ -g -dynamiclib -Wl,-headerpad_max_install_names -o libtest.dylib /usr/lib/libexpat.dylib /usr/lib
-
关于C++静态数据成员的实现讲解
静态数据成员是在一个类中用关键字static声明的数据成员.在C++中,一般使用静态成员来代替C语言的全局变量,以达到数据共享.C和C++的全局变量有一定的局限性,可以任意被修改,也容易和其它的变量名冲突,故在C++中,一般不使用全局变量. 静态数据成员必须进行初始化,初始化应在类体外进行,静态数据成员也可以引用,但不能引用私有数据部分. 接下来看一个例子: #include <iostream> #include <cstring> using namespace std ; c
-
C/C++静态类和this指针详解及实例代码
C/C++静态类和this指针详解 1.静态类 C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问. class CBook{ public: static double price;//需要通过类外来进行初始化 } int main(void){ CBook book; book.price;//通过对象来访问 CBook::price//通过类名来访问 return 0; } 静态成员变量 对应静态成员有以下几点需要注意: (1)静态数据成员可以是当前类的类型,而其他数据成员
-
C++静态持续变量介绍
目录 1.auto关键字 2.静态持续变量 1.auto关键字 我们现在知道,使用auto关键字可以自动推导变量类型,尤其是在一些很复杂的情况下,使用auto可以大大简化代码.但是在早期的C++和C语言当中,auto关键字被用来显式地表示某个变量为自动存储. auto float dis; 这个功能几乎不被使用,所以在C++11当中进行了更新,赋予了它新的含义. 2.静态持续变量 除了自动存储变量之后,C++当中还有静态持续变量.关于静态持续变量的定义C++和C语言是一样的,它拥有三种链接性,即
-
EasyC++静态持续变量
目录 1.auto关键字 2.静态持续变量 文章转自微信公众号:Coder梁(ID:Coder_LT) 1.auto关键字 我们现在知道,使用auto关键字可以自动推导变量类型,尤其是在一些很复杂的情况下,使用auto可以大大简化代码.但是在早期的C++和C语言当中,auto关键字被用来显式地表示某个变量为自动存储. auto float dis; 这个功能几乎不被使用,所以在C++11当中进行了更新,赋予了它新的含义. 2.静态持续变量 除了自动存储变量之后,C++当中还有静态持续变量.关于静
-
PHP类的静态(static)方法和静态(static)变量使用介绍
在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用"->"调用:$object->attribute/function,前提是该变量/方法可访问. 2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以.但是有前提条件: A. 如果是变量,需要该变量可访问. B. 如果是方法,除了该方法可访问外,还需要满足: b1) 如果是静态方法,没有特殊条件: b2) 如果是非
-
IOS 打包静态库详细介绍
IOS 打包静态库详细介绍 一.前言 前段时间看的一本书上说:"隔着一段距离看,很多有趣的知识看起来都很唬人."比如说这篇我要总结的"静态库知识",在我初出茅庐的时候着实觉得那些后缀名为".frameworke".".a".".dylib"的文件很神秘,很高冷.那时我虽然知道只要导入一个库就能引用库里面很多封装好的东西,但对这个"库"究竟是什么"鬼",一直都是云里雾里
-
PHP 第三节 变量介绍
变量名与 PHP 中其它的标签一样遵循相同的规则.一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线.按照正常的正则表达式,它将被表述为:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'. Note: $this 是一个特殊的变量,它不能被赋值. 变量默认总是传值赋值.那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量.这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到
-
Android控件系列之XML静态资源使用介绍
学习目的: 1.了解在Android中如何设置和调用XML资源 2.掌握如何利用XML和JAVA代码进行协同开发界面 3.理解R文件的作用 开发Android时,总能看到一个系统自动生成的R.java文件: 您必须了解一下几个要点: 1.R.java是自动生成的,并且强烈建议您不要去手动修改其中的代码.2.R类中的若干个内部类的名字和Android项目中的res文件下的子文件名字一致(除了drawable自动分为了高中低3个等级): 您的项目中可能不是如上图中的文件或代码,但它们一定符合上述的规
-
深入浅出Shell编程 Shell变量介绍
•深入浅出Shell编程: Shell 变量 ◦1 系统变量 ◦2 Shell用户变量 ■2.1 基础 ■2.2 使用技巧 ■2.3 shell 中的数组 ◦3 shell 环境变量 先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量.其中用户变量在编程过程中使用最多,系统变量在对参数判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置. 1 系统变量 Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候.
-
有关perl的内置特殊变量介绍
一.正则表达式特殊变量 1.$n :包含上次模式匹配的第n个子串2.$& :前一次成功模式匹配的字符串3.$` :前次匹配成功的子串之前的内容4.$' :前次匹配成功的子串之后的内容5.$+ :前一次使用括号的模式匹配的字符串. 二.文件句柄特殊变量 1.$| :如果设置为零,在每次调用函数write或print后,自动调用函数fflush,将所写内容写回文件2.$% :当前输出页号3.$= :当前每页长度4.$- :当前页剩余的行数5.$~ :当前报表输出格式的名称.默认值是文件句柄名.6.$
-
Ruby 中$开头的全局变量、内部变量、隐藏变量介绍
Ruby 中充满了一系列的隐藏变量,我们可以从这些预定义的全局变量中获取一些有意思的信息. 全局进程变量 $$ 表示当前运行的 ruby 进程. 复制代码 代码如下: >> $$=> 17170 我们可以从当前进程杀死它自己 复制代码 代码如下: >> `kill -9 #{$$}`[1] 17170 killed irb $? 表示最近一个子进程的状态 复制代码 代码如下: >> `echo hello`=> "hello\n&qu
-
Sqlserver 表类型和表变量介绍
表类型可以用在存储过程中,用于批量增加表类型定义: 复制代码 代码如下: CREATE TYPE dbo.SubCardTable as table ( [SC_ID] [varchar](50), [ZhuKaInfo_ID] [varchar](50), [Project_KeyName] [varchar](50), [SC_CardNumber] [varchar](50), [Statues] [int] DEFAULT 0
随机推荐
- JavaScript小技巧 2.5 则
- Redis Set 集合的实例详解
- WebService教程详解(一)
- Global.cs中自动获取未处理的异常
- ES6学习笔记之Set和Map数据结构详解
- J2ME/J2EE实现用户登录交互 实现代码
- mysql 性能的检查和调优方法
- php运行出现Call to undefined function curl_init()的解决方法
- 使用asp代码突破163相册的防盗连
- 把WebLogic EJB程序迁移到JBoss上
- Android 音乐播放器的开发实例详解
- jQuery实现鼠标可拖动调整表格列宽度
- shiro之INI配置详解
- MongoDB入门教程(包含安装、常用命令、相关概念、使用技巧、常见操作等)
- jquery实现隐藏在左侧的弹性弹出菜单效果
- JQuery拖拽元素改变大小尺寸实现代码
- 比较常见的javascript中定义函数的区别
- js获取dom的高度和宽度(可见区域及部分等等)
- javascript表单处理具体实现代码(表单、链接、按钮)
- Java中\n和\r区别