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

news2024/11/17 21:17:39

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.coloradmin.cn/o/756825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[QT编程系列-13]:QT快速学习 - 1- 初识

目录 第1章 QT的介绍 1.1 QT VS MFC 1.2 QT历史 1.3 QT的应用 1.4 QT学习方法 1.5 QT对象树 1.6 2-8定律 1.7 QT优势&#xff1a; 1.8 QT支持的平台 第2章 QT UI是各种控件对象的堆积 第3章 QT UI是各种控件的堆积 第4章 控件窗口的控制 第1章 QT的介绍 1.1 QT V…

【广州华锐互动】VR石油化工作业实训平台

VR石油化工作业实训平台是一种基于虚拟现实技术的教学、科研辅助工具&#xff0c;可以提供交互式的实验环境&#xff0c;让学生和研究人员在虚拟环境中进行实验。该系统可以帮助学生更好地理解石油炼制过程中的各个环节&#xff0c;包括原油加工、分离、精制等。 通过这种方式…

Python 数据管理

数据管理是收集、收集原始数据并将其转换为另一种格式的过程&#xff0c;以便在更短的时间内更好地理解、决策、访问和分析。 数据管理的重要性 数据管理是数据科学项目中非常重要的一步。下面的例子将解释它的重要性&#xff1a; 图书销售网站希望显示不同领域的畅销书&#…

推荐一款IDEA神级插件【Bito】而且免费!

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

轮播图,用vue来写一个简单的轮播图

轮播图&#xff0c;用vue来写一个简单的轮播图 写的很简单&#xff0c;就是一个小练习&#xff0c;哈哈哈&#xff0c;下面的几张图分别是轮播图的第一张&#xff0c;中间图&#xff0c;最后一张的效果图。 使用了vue 中的属性绑定 v-bind ,v-show 以及 事件监听 v-on 指令。 思…

NZ13:VBA给数据加密处理

【分享成果&#xff0c;随喜正能量】爱出者爱返&#xff0c;福往者福来。怀揣一颗善良的心&#xff0c;本本分分&#xff0c;坦坦荡荡&#xff0c;多去帮助需要的人&#xff0c;坚持善良做人&#xff0c;才能不负于人&#xff0c;不负自己。。 我的教程一共九套及VBA汉英手册一…

黄皮书-线接触热弹流润滑 Fortran+Matlab转译代码

原Fortran代码有错误&#xff0c;进行了修改&#xff0c;数值上差别不大。根据Fortran代码转的Matlab&#xff0c;可以完美运行&#xff0c;但是因为精度问题有差异&#xff0c;只能说趋势是一致的。 需要私我-资源里只是Fortran运行结果

Spark(25):Spark部署模式对比

目录 0. 相关文章链接 1. Spark支持的集群管理器 2. YARN 模式运行机制 2.1. YARN Cluster 模式 2.2. YARN Client 模式 3. Standalone 模式运行机制 3.1. Standalone Cluster 模式 3.2. Standalone Client 模式 0. 相关文章链接 Spark文章汇总 1. Spark支持的集群管…

Python爬虫——urllib_微博cookie登陆

cookie登陆适用场景&#xff1a; 适用场景&#xff1a;数据采集的时候&#xff0c;需要绕过登陆&#xff0c;然后进入到某个页面 # 适用场景&#xff1a;数据采集的时候&#xff0c;需要绕过登陆&#xff0c;然后进入到某个页面 import urllib.requesturl https://weibo.cn/7…

不用显示器,不用鼠标和键盘,让我们用主机远程访问OK3588的桌面

不用显示器&#xff0c;不用鼠标和键盘&#xff0c;让我们用主机远程访问OK3588的桌面 MobaXterm软件介绍串口终端运行命令MobaXterm访问开发板 MobaXterm软件介绍 MobaXterm是一款增强型终端软件&#xff0c;对于Windows平台上的程序员、网络管理员和开发者是一款极其优秀的工…

数据库 --- mysql(03)-- mysql字符集、表操作(01)

MYSQL 1、mysql字符集 &#xff08;1&#xff09;简介&#xff1a; MySQL字符集包括字符集&#xff08;CHARACTER&#xff09;和校对规则&#xff08;COLLATION&#xff09;两个概念&#xff1a; 字符集&#xff08;CHARACTER&#xff09;是一套编码校对规则&#xff08;CO…

Spark(24):Spark内核概述

目录 0. 相关文章链接 1. Spark核心组件 1.1. Driver 1.2. Executor 2. Spark通用运行流程概述 0. 相关文章链接 Spark文章汇总 1. Spark核心组件 1.1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作。Dr…

基于SSM的新生报到系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

USB接口种类知多少?一起来温故一下吧!

前言 USB接口类型有很多&#xff0c;如下图所示&#xff0c;到底哪个是哪个&#xff1f;都怎么称呼&#xff1f; 本人也是对各种USB接口一知半解&#xff0c;趁着今天周末&#xff0c;整理了下USB接口的种类&#xff0c;相信也有很多跟我一样对其了解不够深的朋友&#xff0c;那…

测试开发必备技能-Jmeter二次开发

01 概述 为什么需要做二次开发&#xff1f;JMeter作为一款开源的性能、接口测试工具&#xff0c;有时候无法满足我们工作的需要&#xff0c;一般体现在&#xff1a;协议不支持、没有相应数据处理功能等。 一般这种情况下&#xff0c;我们可以做的选择有&#xff1a; 第一种找…

4.Java基本数据类型

Java 的两大数据类型: 基本数据类型引用数据类型 1. 八种基本类型。六种数字类型&#xff08;四个整数型&#xff0c;两个浮点型&#xff09;&#xff0c;一种字符类型&#xff0c;还有一种布尔型 byte&#xff1a; byte 数据类型是8位、有符号的&#xff0c;以二进制补码表…

Python 列表 extend()函数使用详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 extend函数使用详解 1、可以接收的参数1.1、添加字符串1.2、添加元组1.3、添加字…

ts学习(一):基础篇1

旨在记录&#xff01; 这篇人都学废了&#xff0c;本想记录常用类型&#xff0c;越学越多&#xff0c;每一个都很重要… 一、string: 字符串类型二、number: 数字类型三、boolean: 布尔值四、array:数组五、tuple: 元组六、字面量七、object:对象八、any: 任意类型九、unknown:…

Nacos知识掌握【快速入门】

通过上面的调用图会发现&#xff0c;除了微服务&#xff0c;还有一个组件是服务注册中心&#xff0c;它是微服务架构非常重要 的一个组件&#xff0c;在微服务架构里主要起到了协调者的一个作用。注册中心一般包含如下几个功能&#xff1a; \1. 服务发现&#xff1a; 服务注…

第十章:PSPNet——金字塔场景解析网络

0.摘要 场景解析对于无限制的开放词汇和多样化的场景是具有挑战性的。在本文中&#xff0c;我们通过金字塔池化模块和提出的金字塔场景解析网络&#xff08;PSPNet&#xff09;&#xff0c;利用全局上下文信息的能力&#xff0c;通过基于不同区域的上下文聚合&#xff0c;来处理…