EasyC++,静态持续变量

开发 后端
除了自动存储变量之后,C++当中还有静态持续变量。关于静态持续变量的定义C++和C语言是一样的,它拥有三种链接性,即外部链接性、内部连接性和无链接性。其中外部链接性指的是可以在其他文件中访问,内部链接性指的是只能在当前文件访问,无链接性指的是只能在当前函数或代码块中访问。

[[437043]]

 大家好,我是梁唐。

想要追求更好阅读体验的同学,可以点击「阅读原文」访问github仓库。

auto关键字

我们现在知道,使用auto关键字可以自动推导变量类型,尤其是在一些很复杂的情况下,使用auto可以大大简化代码。但是在早期的C++和C语言当中,auto关键字被用来显式地表示某个变量为自动存储。

  1. auto float dis; 

这个功能几乎不被使用,所以在C++11当中进行了更新,赋予了它新的含义。

静态持续变量

除了自动存储变量之后,C++当中还有静态持续变量。关于静态持续变量的定义C++和C语言是一样的,它拥有三种链接性,即外部链接性、内部连接性和无链接性。其中外部链接性指的是可以在其他文件中访问,内部链接性指的是只能在当前文件访问,无链接性指的是只能在当前函数或代码块中访问。

这三种链接性虽然范围不同,但都在整个程序运行期间存在,因此它们的寿命更长,由于在程序运行期间,静态持续变量的数目保持不变,因此不需要使用栈来管理它们。编译器将会分配固定的内存块来存储所有的静态变量,这些变量在整个程序运行期间一直存在。

并且所有没有显式初始化的静态变量,编译器都会将它置为0。在默认情况下,静态数组和结构将所有元素和成员的所有位都置为0。

下面介绍一下这三种静态持续变量的创建方法:

  1. int cnt = 1000; 
  2. static int one_file = 50; 
  3.  
  4. void func1(int n) { 
  5.     static int ret = 0; 
  6.  
  7. int main() { 
  8.  // some statements 

在上面这段代码当中,我们定义了三个静态持续变量:cnt,one_file,ret。其中cnt为外部链接性,它可以在任何地方使用。one_file为内部链接性,可以在当前文件中任意地方使用。而ret没有链接性,只能在函数func1中使用。

但是这里有一点要注意,虽然ret只能在函数func1中使用,但这并不意味着函数func1执行之前ret不存在。前面说了静态持续变量拥有单独的内存块来存储,并不受函数生命周期的影响。我们来看一个例子:

  1. void test() { 
  2.  static int ret = 0; 
  3.  ret++; 
  4.  cout << ret << endl; 
  5.  
  6. int main() { 
  7.     test(); 
  8.  test(); 
  9.  return 0; 

请问当我们运行上述代码,屏幕当中会得到什么结果?

答案是1和2,因为ret变量是一个静态持续类型,虽然我们只能在函数test内部使用它,但它不受函数test生命周期的影响。也就是说static int ret = 0;这句初始化语句只会在test函数第一次执行时执行一次,之后即使函数退出,这个值依然存在。当我们第二次执行的时候,由于ret变量已经存在,所以并不会将它再置为0。

对于这里用到的关键字static,简单理解成静态是不妥的。其实它有两层含义,当我们是在一个函数内部局部声明的时候,它表示的是这个变量是一个无链接性的静态变量,表示的是存储的持续性。当用于代码块外部声明时,static表示的是内部链接性,如果不加static则表示外部链接性。所以这其中的作用是有一点区别的,也有人将它称为关键字重载,即关键字的具体含义取决于上下文。

责任编辑:武晓燕 来源: Coder梁
相关推荐

2021-11-26 10:56:28

C++存储持续性

2021-12-12 18:13:54

C++This指针

2021-12-29 20:31:40

C++多态指针

2021-12-09 10:56:50

函数C++原型

2021-11-26 00:03:20

C++编译常量

2021-12-08 10:43:09

C++实现

2021-12-30 14:58:58

C++函数动态

2021-12-10 10:45:36

C++函数Stock

2021-10-26 00:19:51

C++结构体存储

2021-11-09 10:38:16

C++Const指针

2021-12-11 19:02:03

函数C++对象

2021-11-10 10:48:36

C++函数指针

2021-12-15 10:25:57

C++运算符重载

2022-01-04 16:35:42

C++Protected关键字

2021-12-05 18:20:42

C++空间特性

2021-10-26 15:36:17

C++枚举值类型

2021-10-27 16:27:20

C++指针操控

2021-12-26 00:08:35

C++初始化列表

2021-12-16 10:40:11

C++运算符重载

2021-10-21 18:52:00

C++数组存储
点赞
收藏

51CTO技术栈公众号