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…...

双子塔楼宇可视化系统:提升建筑管理与运营效率
利用图扑可视化技术对双子塔楼宇的各项功能进行实时监控和管理。通过数据分析优化资源配置,提高能源效率,增强楼宇安全性,实现智能化运营。...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...