存储持续性-作用域-连接性

存储持续性-作用域-连接性

人话:
存储持续性:变量能活多久
作用域:变量在哪能用
连接性:变量能不能被其他文件用

下面来和各位讲解各个知识点

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),大小灵活,按需分配,需手动管理

posted @ 2026-01-30 00:40  努力的小xu  阅读(4)  评论(0)    收藏  举报