服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++静态持续变量介绍

C++静态持续变量介绍

2022-03-07 14:00梁唐 C/C++

这篇文章主要介绍了 C++静态持续变量,静态持续变量的定义C++和C语言是一样的,它拥有三种链接性,即外部链接性、内部连接性和无链接性。其中外部链接性指的是可以在其他文件中访问,内部链接性指的是只能在当前文件访问

1、auto关键字

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

?
1
auto float dis;

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

2、静态持续变量

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int cnt = 1000;
 
static int one_file = 50;
 
void func1(int n) {
 
    static int ret = 0;
 
}
 
 
 
int main() {
 
 // some statements
 
}

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

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

我们来看一个例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void test() {
 
 static int ret = 0;
 
 ret++;
 
 cout << ret << endl;
 
}
 
 
 
int main() {
 
    test();
 
 test();
 
 return 0;
 
}

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

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

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

到此这篇关于 C++静态持续变量介绍的文章就介绍到这了,更多相关 C++静态持续变量内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://developer.51cto.com/art/202111/692681.htm

延伸 · 阅读

精彩推荐
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12