细说C++(四):C++存储类型

C++存储类型·(auto,static,register,extern)

 

从变量值存在的角度来分,可以分为静态存储方式和动态存储方式。

静态存储方式;指在程序运行期间由系统分配固定的存储空间的方式(程序开始执行时分配,在程序执行完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放)。

 

动态存储方式;在运行期间根据需要进行动态存储方式(在程序过程中申请和释放的一些空间)。

内存中供用户使用的存储空间分为:程序区、静态存储区和动态存储区。程序放在程序区,数据放在静态存储区和动态存储区。在动态存储区存放函数形式参数、自动变量(未加static声明的局部变量)和函数调用时的现场保护和返回地址。

 

在C++面向对象设计中,由于类具有封装性,所有类中的成员均不能使用extern,auto,register

 

1.自动变量(auto) 

函数中的局部变量,动态的分配存储空间,数据存储在动态存储区(栈区)中。在调用函数时,系统会自动的给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此,这类局部变量成为自动变量,用关键字auto作为存储类别的声明。

 

   anto 自动的,类型根据初值被推导出来  因此必须初始化

/*
 anto 自动的,类型根据初值被推导出来  因此必须初始化 
*/
 auto i=45;  //i has a type named int 
 double f();
 auto  b=f();   //b has a type named double
 

2、静态变量(static)

static关键字修饰的变量称为静态变量。

static修饰局部变量

       static修饰局部变量时,改变了它的存储区域——存储在静态区,使得该变量的生命周期发生了变化:该变量不随函数调用结束而释放,只要程序还在运行,都不释放;但没有改变其作用域,该变量还是只能在定义该变量的域内部使用,不能被其它函数调用

       静态局部变量是在编译时赋初值的,所以只赋初值一次,在程序运行期间它已有初值,每次调用函数时不再重新赋值而是保留上次调用结束时的值。如果在定义静态局部变量时不赋初值的话,编译时会自动赋初值0或空字符‘\0’。

       而对局部变量来说,实在函数调用时赋初值的,所以每次调用都重新定义且赋初值一次。如果自动变量不赋初值的话,它的值是一个随机值。

static修饰全局变量

      全局变量都是存放在静态存储区的,它们的生命周期是程序的整个过程,作用域是从定义该全局变量的开始到文件结束。当全局变量被static修饰时,该变量就不能被其它文件所使用,表示该变量仅作用于本模块。改变了该变量的连接属性,从外部链接变成了内部链接。

 

3、寄存器变量(register)

      一般情况下,变量的值是存放在内存中的。当程序中用到那个变量时,由控制器发出指令将内存中的数据送到运算器中。通过运算器进行运算,如果需要存数,再从运算器将数据运到内存中存放。

       如果有一些变量使用频繁,则为存取变量的值要花不少时间,为提高CPU的执行效率,编译器会将这些经常使用的局部变量的值放在CPU的寄存器中,寄存器的存取速度远高于内存的存取速度,这样就提高了执行效率。这样,这样被存放在寄存器中的变量叫做寄存器变量,用关键字register声明。

register int a;//声明寄存器变量

现在,编译器可以总动识别使用频繁的变量,会自动将它优化进寄存器中,不需要程序员声明。

 

4、外部变量(extern)

     使用extern扩展作用域!

用来声明外部变量和外部函数(和static一种用法相对),extern只是声明而不是定义

  1. 在一个文件内部扩展作用域

表示变量的定义在当前引用的后面

      在定义点之前的函数要想使用该外部变量,则应该在引用前,用extern对该变量做外部变量声明,表示把外部变量的作用域扩展到此位置。

2.多文件中声明外部变量

      表示该变量定义在文件外部

 

  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值