C++存储持续性、作用域和链接性的学习

存储持续性

表示数据保留在内存中的时间。

  1. 自动存储持续性:在函数定义中声明的变量的存储持续性为自动的。 该变量在执行完函数或代码块时,它们的内存被自动释放。(局部变量)
  2. 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态。它们在程序整个运行过程中都存在。(全局变量和静态变量)
  3. 动态存储持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。(动态内存分配的变量)

作用域

作用域描述了名称在文件的多大范围内可见。比如函数中声明的变量只能在该函数中使用,不能在其他函数中使用。

  1. 作用域为局部的变量只在定义它的代码块中可用。
  2. 作用域为全局的变量在定义位置到文件结尾之间都可用。
  3. 自动变量的作用域为局部。
  4. 静态变量的作用域是全局还是局部取决于它是被如何定义的。
    • 定义在代码块中的静态变量作用域为局部的。
    • 定义在函数之外的静态变量作用域为全局的。
  5. 名称空间中声明的变量的作用域为整个名称空间。

链接性

链接性描述符了名称如何在不同单元间空间。

  1. 链接性为外部的名称可在文件间共享。
  2. 链接性为内部的名称只能由一个文件中的函数共享。
  3. 无链接性只能在当前函数或代码块中访问。

自动存储持续性

在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性。

int func()
{
    int a;  // a为自动变量,只能在func()函数中使用
}

静态持续变量

静态持续变量有3种链接性

  1. 外部链接性(在代码块的外面声明,可在其他文件中访问)
  2. 内部链接性(在代码块的外面声明,并使用static限定符,只能在当前文件中访问)
  3. 无链接性(在代码块内声明,并使用static限定符,只能在当前函数或代码块中访问)
int global_var = 100;           // 静态持续变量,外部链接性
static int static_var = 20;     // 静态持续变量,内部链接性

int main()
{

}
void func1(int n)
{
    static int count = 0;       // 静态持续变量,无链接性
}

两种声明方式

  1. 定义声明,给变量分配存储空间
  2. 引用声明,不给变量分配存储空间,因为是引用已有的变量。引用声明使用关键字extern,不进行初始化,否则为定义声明,导致分配存储空间。
double a;               // 定义声明
extern int b;           // 引用声明,引用b
extern char c = 'z';    // 定义声明,初始化为'z'了

实例

demo1.cpp

#include <iostream>
using std::cout;
using std::endl;

// 静态持续变量,外部链接性
int all_score;	// 自动初始化为0

// 增加分数
void add_score(int score);

// 局部变量测试
void local_var();
int main()
{
	cout << "全局变量: all_score = " << all_score << endl;
	cout << endl;

	add_score(100);	// 全局变量加100
	cout << endl;

	cout << "全局变量: all_score = " << all_score << endl;
	cout << endl;

	local_var();	// 局部变量和全局变量一起使用
	cout << endl;

	cout << "全局变量: all_score = " << all_score << endl;
	return 0;
}

demo2.cpp

#include <iostream>

using std::cout;
using std::endl;
// 引用声明
extern int all_score;

void add_score(int score);

void local_var();


void add_score(int score)
{
	cout << "================================" << endl;
	cout << "in all_score()" << endl;
	extern int all_score;	// 引用声明
	all_score += score;		// 使用全局的all_score;
	cout << "全局变量: all_score = " << all_score << endl; 
	cout << "================================" << endl;
}

void local_var()
{
	cout << "================================" << endl;
	cout << "in local_var()" << endl;
	int all_score = 200;    // 定义声明
	cout << "局部变量: all_score = " << all_score << endl;

	// 通过作用解析运算符访问全局变量
	cout << "全局变量: all_score = " << ::all_score << endl;
	cout << "================================" << endl;
}

编译

g++ demo1.cpp demo2.cpp -o demo

程序说明

  1. 在add_score()函数中,通过引用demo1.cpp中的all_score变量,可以直接改变demo1.cpp中的all_score。这就是引用声明的用法。

  2. 在local_var()函数中,定义声明了一个all_score变量,因为为它分配了存储空间。而要使用全局变量的all_score则使用作用域解析运算符:::all_score

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值