堆栈等内存分区和const与static变量

一 内存分区
c++编程中,内存可以大致的分为5个区:堆区,栈区,自由存储区,全局(静态)变量区,常量存储区。
其中栈区主要是编译器控制,用于存放一些局部变量/函数参数等,编译器会根据需要自动分配内存和回收内存。
堆区是由编程人员控制,通过new(new[])来分配区域,delete(delete[])来回收区域。如果编程人员忘记回收,会发生内存泄漏,一直到程序结束后被操作系统回收。
自由存储区和堆区类似,是c语言中,通过malloc和free来分配回收的内存,也是由编程人员控制。【其实二者差不多,new/delete是malloc/free的高级版本】
全局(静态)变量区:存放全局变量和static变量。其编译的时候分配内存,程序结束后释放。
常量存储区:存放数据常量,不允许修改。

二 const变量
①const用来修饰某一类型变量,说明该类型变量的值不能被修改。
②const修饰的变量必须初始化,且后续不能再进行修改/赋值。
③类中的const成员变量,必须在类的初始化列表中赋初值。
④const放在函数的前面,表明函数的返回值是const类型,不可修改;放在函数的后面,表明函数为只读函数,不允许修改其中数据成员的值。
⑤const修饰类对象,则该对象只能调用const类型的成员函数(const放在后面)。const类型的成员函数是只读的,不允许修改成员变量的值,也不允许在其中调用其它非const成员函数。
⑥const修饰的变量是只读变量,而非常量。全局的const变量放在常量区,不可以通过地址修改该变量的值;局部的const变量放在栈区,虽然也是只读的,但可以通过变量指针修改变量的值。
⑦局部const变量的作用域为当前函数内;全局const变量的作用域为当前源文件;如果加上extern,则为整个工程。

三 static变量
①static变量只能初始化一次,后续不再进行初始化。{即,比如在函数中定义并初始化static变量,运行函数后该变量有了一个值,下次再调用该函数,初始化语句不起作用,static变量还是用之前的值。如果你不给它初始化,则它自动初始化为0}
②static修饰局部变量,该变量作用域为定义该变量的函数内;修饰全局变量,作用域为定义该变量的源文件,即不能在其它文件中访问。当然,无论局部变量还是全局变量,该类型变量都是存储在全局(静态)变量区。
③static修饰函数,如果修饰普通函数,则是全局静态函数,该函数只能在本文件中调用,不能被其它文件调用。如果修饰成员函数,则是静态成员函数,该函数只能访问修改类的静态成员变量,不会访问或者修改任何对象的数据成员,即非静态成员变量(因为类的静态成员函数/变量属于类本身,其在类加载的时候就分配内存的,而类的对象是在实例化的时候分配内存,此时需要用该类的时候区访问其中的成员变量)。
④static修饰类的成员变量,需要在类外初始化,格式如下:类型 类名::静态变量名 = 初始化值。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值