存储持续性-作用域-连接性
存储持续性-作用域-连接性
人话:
存储持续性:变量能活多久
作用域:变量在哪能用
连接性:变量能不能被其他文件用
下面来和各位讲解各个知识点
1. 作用域和链接
作用域:单个文件使用
链接性:多个文件之间共享
链接性谈论的是跨文件的拓展
//简单示例
void gerneric(){
int a;
}
int mian(){
a=1; //× a的作用域仅在gerneric函数里面
}
2. 自动存储连续性
自动变量存储在栈中,如果不加任何特殊关键字,比如”int a“,都默认为自动存储连续性
自动存储连续性的变量作用域通常是在一个文件内,函数每次调用的时候,都会把上一次调用的给清除掉,重新调用初始值
//代码示例
void adda() {
int a=1;
a++;
cout << a<<endl;
}
int main() {
adda();
adda();
adda(); //调用三次销毁三次a的值,常理来说是4,但是结果还是2
int a = 1;
{
int a = 2;
cout << a<<endl;
} //销毁a,从新回到1
cout << a<<endl;
}
输出
2
2
2
2
1
3.静态持续变量
静态变量(static)使用方式
static int a; //声明一个全局有效的a
作用展示
adda();
adda();
adda();
输出
2
3
4
那么,有小伙伴就会去接着去修改我上面展示的另一部分的代码了
static int a = 1;
{
static int a = 2;
cout << a<<endl;
}
cout << a<<endl;
输出
2
1
奇怪,我明明将他声明成一个静态变量了呀,为什么值还是没有留下来呢?
有个知识点要注意:不是静态变量没作用,而是作用域的「屏蔽规则」在起作用,且内层和外层的static int a是两个完全独立的静态变量。
改正之后,输出就正确了
static int a = 1;
{
int a = 2;
cout << a<<endl;
}
cout << a<<endl;
输出
2
2
4. 外部链接性
之前我们所有的代码都是在一个文件里面进行,现在我们来创建两个文件,假设第一个文件叫file1,第二个文件叫file2,下面来展示一下如何显示外部连接性
file1
#include<iostream>
int a = 1;
void co() {
std::cout << a;
}
file2
#include<iostream>
extern int a;
extern void co();
int main(){
co();
return 0;
}
输出
1
5. 静态持续性-内部链接性
假如使用static关键字,则将函数变为静态变量,无法在别的文件中使用
file1
static a=1;
file2
extren int a; //编译错误!
6. 静态持续性+无连接性
静态变量有跨函数保护,作用域限制
void count_call() {
static int call_num; // 静态持续性,默认初始化0(即使不写=0,也是0)
call_num++;
// 作用域局部:仅count_call内可访问call_num
}
int main(){
for (int i = 0; i < 5; i++) {
count_call();
}
cout << "函数被调用了:" << call_num << "次" << endl; //错误!无法在函数外访问函数内的静态变量!
}
7.说明符和限定符
说明符:与函数存储连续性,作用域,连接性有关(改变操作维度)
static、extern、register(寄存器说明符)、typedef
限定符:能否被修改、访问是否受限(改变变量本质)
const(还有没学到的volatile、constexpr)
8. 语言链接性
语言链接性,即为对语言的转化
为什么需要语言链接?
C与C++的差距就在函数修饰的问题,比如声明函数void fuction(int);
C语言不加修饰,C++则会因为可能会有函数重载修饰成为_Z4funci,所以要通过关键字的修改来解决这个问题
extren "C"{} //告诉编译器使用C语言函数的方式来声明这个函数
其他不过多介绍,用到的场景其实挺少的
9.存储方案和动态分配
C++的三大内存区为:栈,静态区,堆
栈(stack):自动变量、函数参数、返回值 编译器自动分配 随作用域创建,销毁,编译器自动管理,小,(几 M),速度快,无需手动管理,大小受限
静态区(data):全局变量、static 变量,编译器自动分配 程序启动,退出,编译器自动管理,较大,值永久保留,默认初始化 0
堆(heap):动态分配的变量,对象 程序员手动分配,程序员手动创建,释放 程序员手动管理,极大(几 G),大小灵活,按需分配,需手动管理

浙公网安备 33010602011771号