C++深入理解(5)------静态持续变量(读书笔记)

    C++为静态持续变量提供了三种连接性:外部链接性(可在不同文件中访问)、内部连接性(只能在当前文档中使用)、无连接性。下面介绍什么是静态变量:静态变量就是在整个程序持续中都是存在的,在整个过程中静态变量的数量都是不变的,程序并不需要特殊的装置(栈)来管理他,而是在程序的一开始就申请内存。所以也可以叫做静态持续变量。

    简单说下怎么创建三种不同链接性的变量:1、外部链接性:需要在代码块的外部定义;2、内部链接性:需要在代码块的外部定义,但是要使用static声明,表名是内部可以访问的;3、无连接性:在代码块内部定义,并使用static声明,这样的变量在整个代码执行周期内都是存在的,但是只能在代码块的内部访问他。

int a;            //外部链接性
static int b;     //内部链接性

int func(int a,int b)
{
    static int c; //无链接性
}    

    这里需要格外注意的一点就是只能被初始化1次;注意初始化一次和赋值一次的区别,初始化一次指只能被赋一次初值,如执行函数func()中static int c=10,那么再次执行该函数的时候,这行代码就会被忽略,因为已经赋了一次值了。静态持续变量如果不给其初始化的话,会默认初始化为0;例如上面代码并没有赋值,那么c就是0了,即使在下面执行c=10;也是再执行c的赋值操作,而并非初始化;

1.具有外部链接性的变量:
    具有外部链接性的静态变量又叫做外部变量或者全局变量。C++有单定义规则,即变量只能被定义一次,所以在C++中有两种声明方式:定义声明和引用声明,定义声明给变量分配存储空间,引用声明则是不分配空间,表明之前有定义过此变量。只有使用extern声明,且不能被初始化的变量才能是引用变量,否则就是定义变量,如下面代码:

double  a;         //定义变量
extern double a;   //声明变量
extern double a=10 //定义变量

    外部变量有一点需要注意的是:如果在函数中定义了与全局变量同名的变量,那么是使用局部变量还是全局变量那?答案是使用局部变量,暂时覆盖了全局变量。那么在有同名局部变量的情况下,我们该如何使用同名的全局变量那?答案是使用::符号,如::a;

2.具有内部链接性的变量

    就是用static在代码块的外部定义的内部变量,只能在本文件中访问,而不能在其他文件中访问。

    一般会遇到这样的问题,在外部有一个外部变量,但是本文件中不打算使用该外部变量,于是用static定义了一个同名的内部变量,这样就会覆盖该外部变量,从而达到隔离变量的效果。

3.无连接性的变量

    也就是在函数的内部定义的变量,该变量存在于整个执行过程,拥有特定的内存,当再次执行该函数时,此变量还是上次执行函数操作后变量的值,并不会在此被初始化。


在这里插一条容易被忽略的知识点,使用const int a = 10这样定义的变量实际上是只具有内部链接性的,也就是说在外部是无法访问a的值的,因此可以放心的将此句赋值定义放在头文件中,没一个包含此头文件的源文件都会定义一个具有内部连接性的变量,即只能在本文件中使用,但是如果想设计成外部的const int a应该怎么办呢,答案是使用extern const int a = 10;这句话以为着定义一个外部变脸,因此在其他文件中如果想使用的话只能使用extern int a这样的声明,不能再次做定义。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章