C++学习之static关键字小结

news/2024/11/16 6:39:49/

static在C++编程中随处可见,但是其真实的使用方式没有总结过,因此在使用中经常出一些问题,下面就C++编程中static关键字在的几种用法进行相关总结说明如下。

1、在函数内部定义带有static关键字的变量时,则变量是保存在静态存储区的,在程序编译的时候初始化,如果不给初始值,则会默认给0。每次调用该函数,该静态变量都会保持上一次函数结束调用的值。

编写如下程序进行测试:

#include<ostream>
#include"demo.h"
#include <iostream>using namespace Demo;
int func() {static int tmpval ;tmpval += 1;return tmpval;
}int main()
{for (int i = 0; i < 5; i++){int val = func();printf("第%d调用后,tmpval的值为%d\n", i + 1, val);}return 0;
}

测试结果如下:
在这里插入图片描述
tmpval最开始初始化后,编译程序会给他赋值为0,第一次程序运行结束,结果变为1,因此输出结果为1,此后每次的输入都是上一次输出。

2、在代码中定义带有static关键字的全局变量,则该全局变量只能在当前文件中起作用,无法引用到其他文件中。

编写测试程序如下:

//demo.h文件
#pragma once
namespace Demo {
static int iStaticVal = 10;
int add(int x, int y);
}//demo.cpp文件
#include"demo.h"
namespace Demo {
int add(int x, int y) {int sum = x + y;iStaticVal = iStaticVal + sum;printf("静态变量iStaticVal=%d\n", iStaticVal);return sum;
}
}//测试文件main.cpp
#include<ostream>
#include"demo.h"
#include <iostream>
using namespace Demo;
int main()
{int a = 10, b = 20;for (int i = 0; i < 5; i++){int res = Demo::add(a, b);printf("外部直接打印iStaticVal的结果为:%d\n", Demo::iStaticVal);Demo::iStaticVal += 1;printf("外部调用iStaticVal后的结果为:%d\n", Demo::iStaticVal);}return 0;
}

测试结果如下:
在这里插入图片描述

从结果中可知:

  • 带有static关键字的全局变量,在文件内部调用作用域仅限于文件内部,出了文件还是初始化为最开始的10。
  • 不同的文件中调用,值的变化也仅仅在不同的文件中各自变化,因此不同文件中无法实现同步变化。

3、在函数定义之前增加static,那么该函数只能在本源程序文件中调用,无法在其他源程序文件中调用。

//demo.h文件
#pragma once
static int iStaticVal = 10;
namespace Demo {
int add(int x, int y);
static int mul(int a, int b);
}//demo.cpp文件
#include"demo.h"
namespace Demo {
int add(int x, int y) {int sum = x + y;iStaticVal = iStaticVal + sum;printf("静态变量iStaticVal=%d\n", iStaticVal);int res = mul(x, y);printf("mul函数内部调用后结果res=%d\n", res);return sum;
}static int mul(int a, int b) {int res = a * b;return res;
}
}//测试文件main.cpp
#include<ostream>
#include"demo.h"
#include <iostream>
using namespace Demo;
int main()
{int a = 10, b = 20;for (int i = 0; i < 5; i++){int res = Demo::add(a, b);printf("外部直接打印iStaticVal的结果为:%d\n", iStaticVal);iStaticVal += 1;printf("外部调用iStaticVal后的结果为:%d\n", iStaticVal);int cc = Demo::mul(a, b);}return 0;}

直接运行代码,发现报错如下:
在这里插入图片描述

如果将 int cc = Demo::mul(a, b)这段代码注释掉,那么程序运行如下:
在这里插入图片描述
由此可见:
函数定义带有static的,只能在定义函数的cpp文件内部使用,外部无法直接调用该静态函数。

以上就是关于static的一点小总结,如果问题,敬请指正,大家共同进步。

——END——


http://www.ppmy.cn/news/892804.html

相关文章

【MySQL】常见函数使用(二)

&#x1f697;MySQL学习第二站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 就如同许多编程语言中的API一样&#xff0c;MySQL中的函数同样是官方给我们封装好的&#xff0c;可以直接调用的一段代码。…

狂野飙车8服务器在哪个文件夹,狂野飙车8存档在哪

这款游戏的的存档方法&#xff0c;不同的版本是不一样的。如果是ios苹果版本的狂野飙车8游戏&#xff0c;存档的位置应该是放置在游戏安装的目录下面的Documents目录的下面&#xff0c;玩家只需要将存档的内容放置在这个目录的下面&#xff0c;选择覆盖就可以了。这就是狂野飙车…

《极品飞车 地下狂飙2》秘籍

《极品飞车 地下狂飙2》除了比上一代更好的创意之外&#xff0c;对车辆的行驶特性的模拟也有了长足的进步&#xff0c;虽然与真车还有很大的差距&#xff0c;但车辆的大致特性已经被完全模拟出来了。 所有内容包括&#xff1a;车辆模式的分类与概述&#xff0c;不同驱动模式车辆…

极品飞车:地下狂飙2技巧和窍门

极品飞车&#xff1a;地下狂飙2技巧和窍门 以一个漂亮的照片拍摄一旦你在照片拍摄方面&#xff0c;新闻界&#xff0c;握住你的手闸&#xff0c;然后转速发动机&#xff0c;按左边或右边。这款车应该做的甜甜圈。虽然是这样做的&#xff0c;拍照。这会给烟雾弥漫看在画面的车轮…

使用 YOLOv8 和 Streamlit 构建实时对象检测和跟踪应用程序:第 1 部分-介绍和设置

示例:图像上的对象检测 介绍 实时视频中的目标检测和跟踪是计算机视觉的一个重要领域,在监控、汽车和机器人等各个领域都有广泛的应用。 由于需要能够识别和跟踪对象、确定其位置并对它们进行实时分类的自动化系统,对视频帧中的实时对象检测和跟踪的需求日益增加。 在这…

5G全网通工业三防平板Windows移动电脑

当今科技领域的快速发展为我们的生活带来了许多便利和高效性能。在这个数字化时代&#xff0c;移动设备已成为我们生活的重要组成部分。在这一领域&#xff0c;搭载全新第12代英特尔酷睿Mi5-1235U/i7-1255U处理器的工业三防平板Windows移动电脑无疑是一款引人注目的产品。 这款…

Elementary OS安装打印机HP LaserJet 1020

Elementary OS是基于Ubuntu的一款华丽发行版。作为小眼儿的主要操作系统&#xff0c;承担了大部分日常工作&#xff01;但是当她碰到办公室的老HP1020,突然就抓了瞎。 打印任务发送出去以后&#xff0c;屏幕右上角消息提示“打印中”…“打印完毕”&#xff0c;可眼瞅着打印机却…

hp laserjet 1020驱动 for windows

hp laserjet 1020驱动 for windows http://h10025.www1.hp.com/ewfrf/wc/product?cccn&dlczh-hans&lczh-hans&os228&product439320&sw_lang& 关于打印机的双面打印 在打印机的属性里进行设置&#xff0c;打出来的要水平旋转&#xff11;&#xff18;&…