`

C++ static关键字详解

    博客分类:
  • C++
阅读更多
1.预备知识:动态存储和静态存储
 
    内存中供用户使用的存储空间可以分为三部分,即: 程序区,静态存储区, 动态存储区
数据分别存放在静态存储区和动态存储区中。全局变量存储在静态存储区中,在程序开始执行时给全局变量分配存储单元,程序执行完毕就释放这些单元。它们的生命周期是整个程序运行的生命周期。在程序执行过程中它们占据固定的存储单元,而不是动态地分配和释放。
    在动态存储区中存放一下数据:1)函数的形参 2)函数中的自动变量(未加static声明的普通局部变量)3)函数调用时的现场保护和返回地址

2.static声明的局部变量
   
     函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态分配存储空间的。函数的形参和在函数中定义的变量都属于这一类。在调用函数时,系统给形参和函数中定义的变量冬天分配存储空间,数据存储在动态存储区中。在函数调用结束时就自动释放这些空间。
    有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的内存空间不进行释放,在下一次调用函数时保留上一次函数调用结束时的值。这时就应该声明该函数是静态局部变量。
    静态局部变量有以下几个特点:
   (1)静态局部变量在静态存储区中分配存储单元。在整个程序运行的过程中都不进行释放
   (2)为静态局部变量赋初值是在编译时进行的。只赋初值一次,在程序运行时就已经有初值了。
   (3)如果在定义局部变量时不赋初值,对静态变量自动赋值0 或空字符。
   (4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。

3.static声明静态外部变量
   
    普通的外部变量可以供整个程序使用,在一个外部变量的源文件中声明的外部变量,在另一个文件中用extern关键字加以引用。
    用static关键字声明的外部变量,只能在其声明的源文件中进行访问,在其他文件中是无法访问的。因此,static关键字修饰的外部变量,为其加上了访问域。
   然而,值得注意的是,无论是加上static的外部变量或是没有加static的外部变量,数据都要存储在静态的存储区中。


4.总结
    static修饰全局变量,则该变量在本文件中有效;static修饰局部变量,则该变量可保存状态;static修饰函数,则函数仅在本文件中有效。

分享到:
评论

相关推荐

    C++ static关键字的原理及用法详解

    在C++中,static关键字是一个多功能且重要的修饰符,它可以用于变量、函数、类成员以及类本身。本文详细介绍了static关键字在C++中的作用和原理,并通过充分的代码示例进行了说明,帮助读者深入理解并正确使用static...

    C++中关键字的探讨

    C++的有些关键字的详解,收集一下很有帮助的

    C++面试基础之static关键字详解

    static是 c++ 的关键字,顾名思义是表示静态的含义。它在 c++ 中既可以修饰变量也可以修饰函数。那当我们使用 static 时,编译器究竟做了哪些事情呢? 早先面试中被问到 static 关键字,感觉既熟悉又陌生。熟悉是都...

    详解c++中的 static 关键字及作用

     1、用 static关键字 修饰;  2、可以用 类名::成员名 访问 静态成员;  3、静态成员 属于 整个类;  4、静态成员 是所属类的成员,其它类不能访问;  5、静态成员的内存分配 是 唯一的;  1) 静态成员变

    浅谈C/C++中的static与extern关键字的使用详解

    本篇文章是对C/C++中的static与extern关键字的使用进行了详细的分析介绍,需要的朋友参考下

    C/C++static详解

    详细的描述C/C语言的关键字static的作用,及使用时应该注意的事项!

    详解C++中static的用法

    主要介绍了c++中static的用法详解,C 语言的 static 关键字有三种用途,具体内容详情大家跟随脚本之家小编一起学习吧

    详解c++ 静态成员变量

    C++的static关键字可修饰类成员变量/方法,表示变量/方法不从属于特定对象,而是属于类的。仔细琢磨静态成员变量,会发现其与C++的方式既相容也矛盾,具有特殊性。 先说相容的一面。·C/C++·有声明和定义的说法:...

    实例详解C/C++中extern关键字

    则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的”脾气”了(不同的...

    C++100天经典实战系(含大量案例源码及通俗讲解教程,effective_c++、STL、综合能力全面提升)

    class、struct、static、sizeof、inline那些事、func_pointer、extern C、explicit(显式)关键字那些事、decltype那些事、const介绍及案例、C++面向对象特性 2、10日c++实战狂练(习题和源码) 3、C++11新特性详解 4...

    C++思维导图Xmind文件和.png文件(持续更新)

    初始化列表、匿名对象、static成员、类的隐式类型转换和explicit关键字、内部类思维导图xmind文件和.png文件 内存管理(new/delete使用详解) 模板——初识 STL——string类 STL——vector STL适配器——stack && ...

    详解C++编程中断言static_assert的使用

    C++ 语言支持可帮助您调试应用程序的三个错误处理机制:#error 指令、static_assert 关键字和 assert (CRT) 宏。所有的三种机制都会发出错误消息,其中两个还会测试软件断言。软件断言指定在程序的某个特定点应满足...

    C++中this指针用法详解及实例

    C++中this指针用法详解及实例 概要: 本文简单介绍this指针的基本概念,并通过一个实际例子介绍this指针用于防止变量命名冲突和用于类中层叠式调用的两个用法。 this指针概览 C++中,每个类 对应了一个对象,每个...

    Linux多线程服务端编程:使用muduo C++网络库

    4.5善用__thread 关键字.. . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4.6多线程与IO . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 98 4.7用RAII 包装文件描述符.. . . . ....

    使用@符号让C#中的保留字做变量名的方法详解

    在c和c++中,我们知道没办法起一个变量名叫int,因为这是C/C++保留的关键字,起这么一个变量名没办法区分到底是int类型还是int变量。事实上在C#中也有这么一条规矩,就是不能起一个变量名是保留的关键字。如下图: ...

    基于typedef的用法详解

    也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一。若说变量定义是为变量命名,而...

Global site tag (gtag.js) - Google Analytics