c/c++--静态变量和静态函数(static)
目录
1 c++静态函数和静态变量
1.1 C++静态成员函数:
1.1.1定义与基本语法
1.1.2 不依赖于实例
1.1.3 访问限制
1.1.4共享数据
1.1.5 作用域与命名
1.1.6 工厂函数和工厂方法(常用途)
1.2 c++静态函数()
1.3c++静态变量
2 c语言静态变量:
2.1 静态局部变量和静态全局变量:
2.2 静态函数
1 c++静态函数和静态变量
1.1 C++静态成员函数:
1.1.1定义与基本语法
在C++中,使用 static 关键字定义静态成员函数。静态函数的定义如下:
class MyClass { public: static void myStaticFunction() { // 函数体 } };
1.1.2 不依赖于实例
静态函数不需要类的实例就可以被调用。这意味着你可以在没有创建对象的情况下直接通过类名调用它。这在需要执行与具体对象无关的操作时非常有用。
MyClass::myStaticFunction(); // 直接通过类名调用
1.1.3 访问限制
静态函数只能访问静态成员变量和其他静态成员函数,不能访问实例成员(非静态成员)。这是因为静态函数的上下文并不与任何具体实例关联。
class MyClass {
public:static int staticVar;int instanceVar;static void myStaticFunction() {staticVar = 10; // 可以访问静态成员// instanceVar = 5; // 错误,无法访问实例成员}
};
1.1.4共享数据
由于静态成员函数和静态成员变量属于类本身,而不是某个特定对象,所以它们可以在所有对象之间共享。这意味着所有对象共享同一个静态变量的值。
class MyClass {
public:static int count;MyClass() {count++;}static void printCount() {std::cout << "Count: " << count << std::endl;}
};int MyClass::count = 0; // 静态变量初始化int main() {MyClass obj1;MyClass obj2;MyClass::printCount(); // 输出 Count: 2
}
1.1.5 作用域与命名
静态函数的作用域一般限于定义它的类,但可以通过类名进行访问。这使得它可以明确地标识出调用的是哪个类的静态函数,避免命名冲突。
1.1.6 工厂函数和工厂方法(常用途)
- 工具函数:静态函数常用于实现不依赖于实例的工具函数,比如数学计算等。
- 工具函数:在
MathUtil类中,静态函数squareRoot和power用于执行数学计算,无需创建类的实例。
工具函数实例:
#include <iostream>
#include <cmath>class MathUtil {
public:// 静态函数:计算平方根static double squareRoot(double number) {return std::sqrt(number); // 返回平方根}// 静态函数:计算幂static double power(double base, double exponent) {return std::pow(base, exponent); // 返回 base 的 exponent 次方}
};int main() {double sqrtValue = MathUtil::squareRoot(16.0); // 计算 16 的平方根double powerValue = MathUtil::power(2.0, 3.0); // 计算 2 的 3 次方std::cout << "Square root of 16: " << sqrtValue << std::endl; // 输出 4std::cout << "2 raised to the power of 3: " << powerValue << std::endl; // 输出 8return 0;
}
- 工厂方法:静态成员函数可以用作工厂方法,用于创建类的实例并返回。
- 工厂方法:在
Circle类中,静态成员函数createCircle用于创建Circle实例,构造函数被私有化以防止直接实例化,确保通过工厂方法来控制实例的创建。
工厂方法实例:
#include <iostream>class Circle {
private:double radius;// 构造函数私有化,防止外部直接创建实例Circle(double r) : radius(r) {}public:// 静态工厂方法:创建 Circle 实例static Circle createCircle(double r) {return Circle(r); // 返回 Circle 实例}double area() const {return 3.14159 * radius * radius; // 计算圆的面积}
};int main() {// 使用工厂方法创建 Circle 实例Circle circle = Circle::createCircle(5.0); // 创建半径为5的圆std::cout << "Area of the circle: " << circle.area() << std::endl; // 输出圆的面积return 0;
}
1.2 c++静态函数()
1.3c++静态变量
-
静态成员变量:
-
C++中可以在类中定义静态成员变量,这些变量属于类而不是某个实例。
-
所有实例共享同一个静态成员变量。
-
-
静态局部变量:
-
和C语言中的静态局部变量类似,静态局部变量在函数中定义后,只会初始化一次,并在函数调用结束后保留其值。
-
#include <iostream>class MyClass {
public:static int count; // 静态成员变量MyClass() {count++;}static void printCount() {std::cout << "Count: " << count << std::endl;}
};int MyClass::count = 0; // 静态变量初始化int main() {MyClass obj1;MyClass obj2;MyClass::printCount(); // 输出 Count: 2return 0;
}
2 c语言静态变量:
2.1 静态局部变量和静态全局变量:
C 语言中,使用 static 修饰一个全局变量会将其作用域限制在定义它的文件内。也就是说,其他文件无法访问这个变量,
如果使用 static 修饰一个局部变量,主要有以下几个作用:
-
静态存储期:局部变量会在程序开始时分配内存,并在整个程序运行期间保持该内存的有效性,而不是在每次进入该函数时分配和释放。这意味着该变量的生命周期延续至程序结束。
-
保持值:每次调用该函数时,静态局部变量不会被重新初始化,而是保持上一次函数调用结束时的值。这使得它可以用于在多次函数调用之间保留状态。
-
作用域:静态局部变量的作用域仍然局限于定义它的函数内,外部无法直接访问。
#include <stdio.h>void counter() {static int count = 0; // 静态局部变量count++;printf("Count: %d\n", count);
}int main() {counter(); // 输出: Count: 1counter(); // 输出: Count: 2counter(); // 输出: Count: 3return 0;
}
在这个例子中,count 是一个静态局部变量,它在每次调用 counter() 时保持其值。
2.2 静态函数
限制作用域:静态函数的作用域仅限于定义它的源文件。这意味着其他文件无法调用这个函数,有助于避免命名冲突。
相关文章:
c/c++--静态变量和静态函数(static)
目录 1 c静态函数和静态变量 1.1 C静态成员函数: 1.1.1定义与基本语法 1.1.2 不依赖于实例 1.1.3 访问限制 1.1.4共享数据 1.1.5 作用域与命名 1.1.6 工厂函数和工厂方法(常用途) 1.2 c静态函数() 1.3c静态变量 …...
Windows系统启动MongoDB报错无法连接服务器
文章目录 发现问题解决办法 发现问题 1)、先是发现执行 mongo 命令,启动报错: error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017; 2)、再检查 MongoDB 进程 tasklist | findstr mongo 发现没有进程&a…...
Linux的makefile与进度条小程序实践
makefile make命令主要功能使用方法常用选项 makefile文件基本结构使用案例变量定义内置变量(即系统定义的确定变量)伪目标模式规则条件语句注释makefile中的常用函数 进度条小程序创建文件编辑.h文件编辑.c文件创建main函数makefile文件执行效果 make命令 在linux中ÿ…...
latex写作基础
参考:https://www.bilibili.com/video/BV1ku4y1X7Rz 在线latex:https://cn.overleaf.com/ tex文件基本结构 \documentclass{article} % 文档类型,%是注释\usepackage{graphicx} % 导入各种包,这里是graphicx包\titl…...
Chromium HTML5 新的 Input 类型email对应c++
一、Input 类型: email email 类型用于应该包含 e-mail 地址的输入域。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…...
嵌入式Linux的AXI平台(platform)驱动教程
本文以JFMQL100的Linux系统的AXI接口的平台驱动为例,介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台(platform)驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…...
什么是Java策略模式?与Spring的完美结合
文章目录 什么是策略模式?策略模式的组成部分: 策略模式的示例在Spring中的妙用1. 使用Spring配置2. 在上下文中选择策略3. 动态切换策略 总结推荐阅读文章 在软件设计中,策略模式是一种非常常见的设计模式,它能够让算法的变化独立…...
[Go实战]:HTTP请求转发
前言 在Web应用开发中,请求转发是一项核心且常见的功能,用于负载均衡、服务拆分、路由重定向和业务逻辑处理。通过在Go语言中封装一个通用的HTTP请求转发方法,我们可以简化代码结构,提升可读性、可维护性和可扩展性。本文将探讨如…...
【C++单调栈 贡献法】907. 子数组的最小值之和|1975
本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。 由于答案可能很大,因此 返回答案模 109 7 。 示例 1&#x…...
极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
Django 5 增删改查 小练习
1. 用命令创建目录和框架 django-admin startproject myapp cd myapp py manage.py startapp app md templates md static md media 2. Ai 生成代码 一、app/models.py from django.db import modelsclass Product(models.Model):name models.CharField(max_length255, verb…...
【STM32 Blue Pill编程实例】-I2C主从机通信(中断、DMA)
I2C主从机通信(中断、DMA) 文章目录 I2C主从机通信(中断、DMA)1、STM32的I2C介绍2、I2C模式3、STM32 I2C 数据包错误检查4、STM32 I2C 错误情况5、STM32 I2C中断6、STM32 I2C 主发送和接收(Tx 和 RX)6.1 I2C 轮询模式6.2 I2C 中断模式6.3 I2C DMA 模式6.4 STM32 I2C 设备…...
基于SSM+小程序的旅游社交登录管理系统(旅游4)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理&a…...
高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收器? 我回答: 1. Serial收集器 特点:Serial收集器是最古老、最稳定的收集器,它使用单个线程进行垃圾收集工作。在进行垃圾回收时,它会暂停所有用户线程,即St…...
Java-内部类
个人主页 学习内部类(Inner Class)是Java编程中一项重要且强大的特性,它允许你在一个类的内部定义另一个类。内部类提供了一种将逻辑上相关的类组织在一起的方式,增加了代码的封装性和可读性。接下来带领大家进入內部类的学习。 …...
flutter集成极光推送
一、简述 极光推送,英文简称 JPush,免费的第三方消息推送服务,官方也推出众多平台的SDK以及插件。 参考链接 名称地址客户端集成插件客户端集成插件 - 极光文档 二、操作步骤 2.1 添加插件 flutter项目中集成官方提供的 极光推送flutte…...
D. Skipping 【 Codeforces Round 980 (Div. 2)】
D. Skipping 思路: 注意到最佳策略是先往右跳转到某处,然后按顺序从右往左把没有遇到过的题目全部提交。 将从 i i i跳转到 b [ i ] b[i] b[i]视为通过边权(代价)为 a [ i ] a[i] a[i]的路径,而向左的路径边权都是 0 0 0;目的是找到到从出发…...
【golang】学习文档整理
Binding | Echo 传值时注意零值和传空的区别 需要validate require 和 设置指针配合使用 保证不同值的返回不同 不能客户端传0值被判断为空 测试时要空值零值去测试字段是否正确返回 返回错误是否符合预期...
动态规划-子序列问题——1218.最长定差子序列
1.题目解析 题目来源:1218.最长定差子序列——力扣 测试用例 2.算法原理 1.状态表示 本题可以看作是寻找一个等差序列,并且公差给出,这里并不是普通的使用一个dp表,而是将arr与dp表同时存储于一个哈希表,arr[i]映射dp…...
双子塔楼宇可视化系统:提升建筑管理与运营效率
利用图扑可视化技术对双子塔楼宇的各项功能进行实时监控和管理。通过数据分析优化资源配置,提高能源效率,增强楼宇安全性,实现智能化运营。...
GTE模型在网络安全中的应用:恶意文本检测
GTE模型在网络安全中的应用:恶意文本检测 1. 引言 每天都有海量的文本内容在互联网上流动,从社交媒体帖子到客户服务对话,从新闻评论到私人消息。在这其中,隐藏着不少恶意内容:网络欺诈信息、仇恨言论、虚假信息、垃…...
Windows 7 SP2重构方案:现代硬件适配与系统焕新体验
Windows 7 SP2重构方案:现代硬件适配与系统焕新体验 【免费下载链接】win7-sp2 UNOFFICIAL Windows 7 Service Pack 2, to improve basic Windows 7 usability on modern systems and fully update Windows 7. 项目地址: https://gitcode.com/gh_mirrors/wi/win7-…...
Lingbot-Depth-Pretrain-Vitl-14 结合Transformer架构:深度估计模型优化实战
Lingbot-Depth-Pretrain-Vitl-14 结合Transformer架构:深度估计模型优化实战 深度估计,简单来说,就是让计算机从一张普通的2D图片里,“猜”出每个像素点距离相机的远近。这听起来有点像我们人眼在看世界时,能感知到的…...
李慕婉-仙逆-造相Z-Turbo跨平台GUI开发:使用Qt构建模型调参与预览桌面应用
李慕婉-仙逆-造相Z-Turbo跨平台GUI开发:使用Qt构建模型调参与预览桌面应用 每次看到那些功能强大的AI模型,你是不是也心动过?但一打开命令行,面对密密麻麻的参数和代码,瞬间就觉得头大,只想关掉窗口。对于…...
别再让地图‘飘’了!深入浅出解析Cesium中GCJ-02、BD-09坐标偏移原理与DVGIS库实战
解密国内地图坐标系:从原理到实战解决Cesium中的“飘移”问题 你是否曾在Cesium中加载不同来源的地图数据时,发现明明标注的是同一个位置,却出现了明显的偏移?这种“飘移”现象背后,隐藏着国内地图坐标系复杂的加密体系…...
告别音乐标签混乱难题:Music Tag Web的智能高效解决方案
告别音乐标签混乱难题:Music Tag Web的智能高效解决方案 【免费下载链接】music-tag-web 音乐标签编辑器,可编辑本地音乐文件的元数据(Editable local music file metadata.) 项目地址: https://gitcode.com/gh_mirrors/mu/musi…...
工业数据采集避坑指南:Java+Utgard实现OPC DA高可靠通信的3个关键技巧
工业数据采集避坑指南:JavaUtgard实现OPC DA高可靠通信的3个关键技巧 在工业自动化领域,OPC DA(OLE for Process Control Data Access)协议作为连接工业设备和信息系统的桥梁,其稳定性直接关系到生产数据的完整性和实时…...
麦橘超然Flux部署避坑指南:常见错误与解决方法
麦橘超然Flux部署避坑指南:常见错误与解决方法 1. 部署前的环境准备 1.1 硬件与驱动检查 在部署麦橘超然Flux图像生成控制台前,确保你的硬件环境满足以下要求: 显卡:NVIDIA显卡(RTX 3060及以上)&#x…...
三步搞定B站视频转文字:终极高效内容提取方案
三步搞定B站视频转文字:终极高效内容提取方案 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text Bili2text是一款专为B站视频设计的智能文字提取工具…...
