首先,变量是存储数据信息的,这个数据信息的生命周期如何定义?如何才能不占着茅坑不拉屎。
**静态:**即在整个程序运行期间都一直存在。
存储类别影响信息在文件间的共享
一、不同的方案存储数据,区别就在于数据保存在内存中的时间。
1.1 自动存储持续性: 在栈区,在函数定义中声明的变量(包括函数参数)—是自动的。他们在程序开始执行其所述的函数或者代码块时被创建,在执行完函数或代码块时,他们使用的内存被自动释放。
1.2 静态存储持续性:全局变量和静态变量。
1.3 线程存储持续性:将计算放在可并行处理的不同线程中,如果变量类型使用thread_local声明的,则其生命周期与所述的线程一样长。
1.4 东塔存储持续性:new运算符分配的内存将一直存在,直到你用delete来将其释放或者程序结束。 new分配的内存,在堆区。
二、作用域和链接
链接性决定了哪些信息可在文件间共享(面对文件),描述了名称如何在不同单元间共享。链接性为外部的名称可在文件间共享;链接性为内部的名称只能由一个文件中的函数共享。显然,自动变量的名称不会有链接性,因此不能共享。
【注】函数原型作用域中使用的名称,只在包含参数列表的括号内可用。就是形参名字无所谓,反正只能在那一个括号里可用。
【注】静态变量的作用是全局还是局部,取决于它是如何被定义的。
【注】如果全局变量和局部变量名称相同,会出现:当使用局部变量时,全局变量会被暂时性隐藏,局部变量使用完之后,全局变量又重新可见。
静态持续变量
首先,静态变量在整个程序的执行期间都存在。只是链接性不同。
如何创建?
链接性为外部的静态持续变量:必须在代码块的外部声明它。
链接性为内部的:必须在代码块的外部声明它,并使用static限定符;
链接性无:必须在代码块中声明,并且使用static限定符。这个函数内可用,且不会被释放。例如 下次count = 1; 你再次调用count时,count是1,不会因为执行了count = 0而重新设置count =0;
示例代码:
ing global = 1000; // 具有外部链接性
static int oneFile = 50; // 整个这个文件一直可用
int main()
{
...
}
void func1(int n)
{
static int count = 0; //编译器默认置为0;这个函数内可用,且不会被释放。例如 下次count = 1; 你再次调用count时,count是1,不会因为执行了count = 0而重新设置count =0;
}
静态变量的初始化
1、所有位都会被初始化为0,如果你不主动初始化的话。你主动初始化,会使用你主动的东西。
外部变量的使用 满足C++单定义规则(One Definition Rule)
在单个文件中,外部变量就是全局变量。
C++提供两种变量声明:
1是定义声明,简称定义—(最初的定义)
2是引用声明,简称声明—(引用声明,顾名思义,引用已经存在的定义叫声明)—在其他文件中使用时,必须加使用extern关键字。
【注意】:const 声明的全局变量,默认是内部的链接性,对于全局变量来说,使用const声明全局变量,等于使用static const。
单定义原则:
在file1中定义 全局变量 int errors = 0;
在file2中定义 全局变量 int errors = 5;
你以为不使用extern 就不会报错了吗?如果你使用extern ,说明是引用声明。如果你不使用,就是定义了两次,破坏了单定义原则。所以:
内部变量的使用外部变量的基础上,必须添加static限定符–指出链接性为内部。
**作用总结:**可使用外部变量在多文件程序的不同部分之间共享数据;可使用链接性为内部的静态变量,在同一个文件中的多个函数之间共享数据。如果将全局变量设置为静态的(static),就不用担心其名称与其他文件中的全局变量相同而发生冲突(单定义原则)。所以全局变量的使用,要么使用::(作用域解析运算符),要么给全局变量加个static(变为内部链接性)。
::(作用域解析运算符):表示使用变量的全局版本
说明符和限定符
主要解释:thread_local;
mutable: 可变的,易变的;
thread_local: thread_local 之于线程,犹如常规静态变量之于一个文件的整个程序。
cv限定符
c----const
v----volatile : 易变得,易会发的
volatile: 即使代码没有对内存单元进行修改,其值也可能发生变化。(怪不得用的不多)。
mutable: 即使变量被声明为const 也可以修改。-----
函数和链接性
函数:相当于外部的全局变量,在本文将定义,在其他文件想要使用必须用extern声明。