静态变量、全局变量和局部变量

1、从作用域角度

在C++中,变量根据定义的位置不同会具有不同的声明周期,具有不同的作用域。

(1)全局变量。具有全局作用域,全局变量只需要在一个源文件中定义,就可以在所有源文件中被使用。在其他源文件中,采用extern关键字(表明当前变量的定义在其他源文件中)就能够再次声明这个全局变量;

(2)局部变量。具有局部作用域,局部变量只在该变量所属函数执行期间存在,当函数调用结束,变量被撤销,其所在的内存空间也将被撤回;

(3)静态全局变量。具有全局作用域。它与全局变量的区别在于,在一个源文件中定义声明的静态全局变量,在其他文件中不能被使用。两个文件尽管定义了相同名字的静态全局变量,但都是不同的变量;

(4)静态局部变量。具有局部作用域。这里的局部作用域体现在该静态局部变量所属函数体。静态局部变量与局部变量不同在于,其在函数体内被定义初始化后,直到程序结束都会一直存在,尽管函数体结束,故多次调用同一函数体,将会操作同一个静态局部变量。但其相当于全局变量而言,仅作用于当前函数体,不能够被其他函数使用。

静态局部变量例子:

int function(void)
{
    static int i = 0;
    ++i;
    return i;
}

int main(void)
{
    for (int j = 0; j < 5; j++)
    {
        cout<<function()<<endl;   //success,持续输出1-5
    }
    cout<<i<<endl;   //error,不能作用于其他函数
    return 0;
}

2、从分配空间角度

(1)全局变量,静态全局变量,静态局部变量都是在静态存储区分配空间(在整个程序运行期间都存在),而局部变量在栈中分配空间,malloc和new在堆区;

(2)把局部变量改变为静态变量改变了它的存储方式,即将其从栈区改为了静态存储区,声明周期被改变;全局变量改变为静态变量改变了它的作用域,限制了使用范围,在其他源文件中不能被使用。

posted on 2018-01-22 14:35  chenjx_ucs  阅读(440)  评论(0编辑  收藏  举报

导航