C++ 变量的生命周期和相关细节

学习目标:

C++存储持续性、作用域和链接性

学习内容:

导言:存储类别如何影响信息在文件之间的共享。
存储持续性
c++使用三种不同的方案来存储数据,区别就是不同的方案使信息在内存中存在的时间不同;
1、自动存储持续性:在函数定义中声明的变量,包括函数参数的存储持续性是自动的。在程序执行到所在之处时被创建,到程序代码或者代码块执行完毕之后自动变量使用的内存被释放。
2、静态存储持续性:在函数定义之外定义的变量以及使用static关键字定义的变量的存储持续性都为静态。即它们在程序整个运行过程中都存在。c++有三种存储性为静态的变量。
3、动态存储持续性:用new分配的内存将一直存在,一直到使用delete将new分配的内存释放或程序运行结束为止。这种内存的存储持续性是动态的,有时被称为自由存储或堆。
作用域和链接性
作用域描述了名称在文件的多大范围内可见,例如函数中定义的变量可以在函数中使用,但是不能在其他的函数中使用,而在函数定义之前定义的变量则可以在所有的函数中使用。
链接性描述了名称如何在不同的单元中共享。
自动变量没有链接性,因为它们不能共享。
1、作用域为局部的变量只能在定义它的代码块中使用
2、作用域为全局的变量从变量的定义的位置到文件的结尾都可以使用
3、自动变量的作用域是局部的
4、静态变量的作用域取决于他是如何被定义的
5、在函数原型作用域中使用的名称只在包含参数列表的括号内可用
6、c++函数的作用域可以是整个类或者整个名称空间,但是不能是局部的,如果函数的作用域是局部的话,那么该函数就只对自己可见,因此不能被其他函数调用,这样的函数是没有意义的
自动存储持续性变量的作用域和链接性
在默认的情况下,在函数中申明的函数参数以及变量的存储持续性是自动的,作用域为局部,没有链接性
auto关键字在之前的c语言中的作用是显式的申明变量为自动变量,但是在c++11中他主要用于自动类型推断,几乎不主动使用他。
自动变量和栈
栈(先进后出)可以用于自动变量的管理,常用的方法是取出一段内存将其视为栈(之所以使用栈是因为新的自动变量总是被象征性的放在原有数据的上面,也就是说在相邻的内存中而不是在同一个内存单元中)栈的默认的长度取决于实现,但是栈通常提供改变栈的长度的选项栈使用两个指针来管理栈其中一个指向栈底,另一个指向栈顶(下一个可用的内存单元)
静态持续变量的作用域和链接性
1、链接性为外部的静态变量,作用域为文件,要想创建这样的变量,需要在函数定义代码块 的外面定义变量,定义时不使用static限定符。
链接性位外部的变量简称为外部变量,由于是在函数的外部定义的所以对于所有的函数而言这样的变量都是外部变量,这样的变量可以在外部变量定义之后的任何函数中被使用,但是如果在多文件中使用外部变量由于c++的“单定义规则”程序需要在其他文件中告诉编译器这个变量是已近被定义过的外部变量,由此情况c++提供了两中变量的声明方式,一种是定义声明简称为“定义”他给变量分配存储空间;另一种是引用声明简称为“声明”(要区别于引用变量),他不为变量分配存储空间因为他使用现有的变量。
引用变量的关键字位extern,不进行初始化,否则声明位定义导致分配存储空间。
最后,如果要在多文件中使用外部变量,只需要在一个文件中包含该变量的定义,而在其他使用该变量的文件中使用引用申明关键字extern申明该变量即可。
2、链接性为内部的静态变量,作用域为文件,要想创建这样的变量,需要在函数定义代码块的外部定义变量,同时使用static限定符。
3、无链接性的静态变量,作用域为代码块,要想创建这样的变量,需要在函数定义代码块的内部定义变量并且使用static限定符。
静态变量初始化
1、默认状态下为被初始化的静态变量在初始化时所有位都被设置为零,这种初始化叫做零初始化。
2、如果程序员有显示的初始化时那么静态变量先被零初始化,之后编译器根据文件内容执行常量表达式初始化;如果静态变量的值需要在调用函数之后才能确定,那么静态变量先进行零初始化->常量表达式初始化->动态初始化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值