【面向对象】关于const、extern、static、静态变量与动态变量的一些理解

const 限定符

常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。作用域为只在文件内;
常用方法:const int sum =520; (sum=1314 //错误) //局部变量

extern

extern 放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
常用代码:
//file_1.h
int num; //在全局作用域里声明num
//file_2.cpp
extern int num; //引用外部动态全局变量

另外一种
//file_1.h
extern const int num = 520; //在全局作用域里声明num
//file_2.cpp
extern const int num; //引用外部动态全局变量

static(静态全局/局部量(文件内)) 与extern (大全局)

static 的全局变量作用域只在本文件中,所以extern和static不能同时修饰一个变量;(int a 作用域则是整个程序)
extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量,可以被其他的对象用extern 引用
static 表示静态的变量,只允许对象本身用它,分配内存的时候,存储在静态区,不存储在栈上面,修饰的全局变量声明与
定义同时进行,也就是说它的“全局”只对本编译单元有效,不会影响到其他的单元.

static在类中:对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。

静态变量与动态变量

全局变量和局部变量是从变量的作用域的角度划分。
静态变量和动态变量是从变量的内存分配的角度划分。
静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量。
动态变量在程序执行过程中建立,随函数的调用需要动态的分配存储空间,调用结束释放所占用存储空间
动态变量和静态变量的区别:
1、存储位置
动态变量:存储在内存出栈数据区
静态变量:存储在全局数据区(静态数据区)

2、生命期
动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将失效
静态变量:程序结束时才释放

3、作用域
动态变量:同样的要根据你定义的位置才能确定,和第二点的一样
静态变量:当前文件中有效

引用:

int a=3;
int &b = a;  //这个表示把b引用为a,其实就是给a加了个名字b
b=10;  //结果为a:10  b:10

指针:

*P和&P三者的区别
假设我们定义一个指针p。
那么会经常使用到三个符号:
1,p;   //表示此指针变量指向的内存地址,
2,*p;   //表示此指针指向的内存地址中存放的内容
3,&p;   //而&p就表示编译器为变量p分配的内存地址

程序在内存中的布局结构

BSS(静态内存分配)段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。【存储全局未初始化的变量】

全局数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域。数据段属于静态内存分配。 【存储全局已初始化的变量】

代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于 只读 , 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些 只读的常数变量 ,例如字符串常量等。程序段为程序代码在内存中的映射.一个程序可以在内存中多有个副本.【存储的是二进制后的程序代码】

堆(heap) :堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)【存储初始化的局部变量】

栈(stack) :栈又称堆栈, 存放程序的局部变量 (但不包括static声明的变量, static 意味着 在数据段中 存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。储动态内存分配,需要程序员手工分配,手工释放【储存的动态未初始化变量】

静态变量在类的运用

静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

出现在类体外的函数定义不能指定关键字static;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
调用静态成员函数,可以用成员访问操作符(.)和(->;)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<;类名>::<;静态成员函数名>;(<;参数表>;)调用类的静态成员函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值