当前位置: 首页 > news >正文

C++笔记之静态成员函数的使用场景

C++笔记之静态成员函数的使用场景

在这里插入图片描述

C++静态成员函数的核心特点是不与特定类实例相关,可通过类名直接调用,用于执行与类相关的操作而无需创建类对象。其主要用途是在类级别上共享功能,管理全局状态或提供工具函数。

code review!

文章目录

  • C++笔记之静态成员函数的使用场景
    • 1.共享数据:当类的所有实例需要共享某个数据时,可以使用静态数据成员
    • 2.工具函数: 静态函数成员通常用于实现与类相关的工具函数,这些函数不需要访问实例特定的数据
    • 3.计数或标识: 使用静态成员可以在所有实例之间保持计数或标识的状态
    • 4.单例模式: 静态成员可用于实现单例模式,确保一个类只有一个实例
    • 5.日志记录: 在一个应用程序中使用静态成员来记录和管理日志信息
    • 6.全局配置: 使用静态数据成员来保存全局配置设置
    • 7.数学常数: 在数学库中使用静态成员来提供常用的数学常数
    • 8.数据库连接池: 使用静态成员来管理共享的数据库连接池
    • 9.跟踪对象数量: 使用静态数据成员来跟踪特定类的实例数量
    • 10.全局事件处理: 使用静态函数成员来处理全局事件,如系统信号
    • 11.全局资源管理: 使用静态成员来管理全局资源,如文件句柄
    • 12.全局配置管理: 使用静态成员来加载和管理全局配置信息
    • 13.回调-事件处理:在事件驱动的程序中,可以使用静态回调函数来响应特定事件
    • 14.回调-异步回调:在异步编程中,可以使用静态回调函数来处理异步任务完成的通知
    • 15.回调-插件化架构: 在插件化架构中,可以使用静态回调函数来扩展和定制主程序的功能
    • 16.回调-回调集中管理: 使用静态回调函数集中管理程序中的不同事件和处理逻辑

1.共享数据:当类的所有实例需要共享某个数据时,可以使用静态数据成员

在这里插入图片描述

代码

class BankAccount {
private:static double interestRate; // 静态数据成员,所有账户共享利率double balance;
public:static void setInterestRate(double rate) {interestRate = rate;}// ...
};// 在类外初始化静态数据成员
double BankAccount::interestRate = 0.05;int main() {BankAccount::setInterestRate(0.07); // 所有账户的利率都被更新// ...return 0;
}

2.工具函数: 静态函数成员通常用于实现与类相关的工具函数,这些函数不需要访问实例特定的数据

在这里插入图片描述

代码

class MathUtils {
public:static int factorial(int n) {if (n <= 1)return 1;return n * factorial(n - 1);}
};int main() {int fact = MathUtils::factorial(5); // 调用静态函数成员// ...return 0;
}

3.计数或标识: 使用静态成员可以在所有实例之间保持计数或标识的状态

在这里插入图片描述

代码

class Student {
private:static int count; // 静态数据成员,用于记录学生数量int studentID;
public:Student() {count++;studentID = count;}static int getCount() {return count;}
};int Student::count = 0; // 初始化静态数据成员int main() {Student s1, s2, s3;cout << "Total students: " << Student::getCount() << endl; // 输出学生数量// ...return 0;
}

4.单例模式: 静态成员可用于实现单例模式,确保一个类只有一个实例

在这里插入图片描述

代码

class Singleton {
private:static Singleton* instance; // 静态指针成员,指向单一实例Singleton() { /* 构造函数私有化,防止外部实例化 */ }
public:static Singleton* getInstance() {if (!instance)instance = new Singleton();return instance;}// ...
};Singleton* Singleton::instance = nullptr; // 初始化静态指针成员为 nullptrint main() {Singleton* singleton = Singleton::getInstance(); // 获取单例实例// ...return 0;
}

5.日志记录: 在一个应用程序中使用静态成员来记录和管理日志信息

在这里插入图片描述

代码

class Logger {
private:static std::ofstream logFile; // 静态文件流,用于日志记录
public:static void openLogFile(const std::string& filename) {logFile.open(filename);}static void log(const std::string& message) {if (logFile.is_open())logFile << message << std::endl;}static void closeLogFile() {logFile.close();}
};std::ofstream Logger::logFile; // 初始化静态文件流int main() {Logger::openLogFile("app.log");Logger::log("Application started.");// ...Logger::closeLogFile();return 0;
}

6.全局配置: 使用静态数据成员来保存全局配置设置

在这里插入图片描述

代码

class AppConfig {
private:static int maxConnections; // 最大连接数
public:static void setMaxConnections(int max) {maxConnections = max;}static int getMaxConnections() {return maxConnections;}
};int AppConfig::maxConnections = 100; // 初始化最大连接数int main() {AppConfig::setMaxConnections(150);int max = AppConfig::getMaxConnections();// ...return 0;
}

7.数学常数: 在数学库中使用静态成员来提供常用的数学常数

在这里插入图片描述

代码

class MathConstants {
public:static const double PI;static const double E;
};const double MathConstants::PI = 3.141592653589793;
const double MathConstants::E = 2.718281828459045;int main() {double circumference = 2 * MathConstants::PI * radius;// ...return 0;
}

8.数据库连接池: 使用静态成员来管理共享的数据库连接池

在这里插入图片描述

代码

class DBConnectionPool {
private:static std::vector<Connection> pool; // 静态连接池
public:static void initializePool(int size) {for (int i = 0; i < size; ++i) {pool.push_back(Connection());}}static Connection getConnection() {if (!pool.empty()) {Connection conn = pool.back();pool.pop_back();return conn;}throw std::runtime_error("Connection pool empty.");}static void releaseConnection(const Connection& conn) {pool.push_back(conn);}
};std::vector<Connection> DBConnectionPool::pool; // 初始化静态连接池int main() {DBConnectionPool::initializePool(10);Connection conn = DBConnectionPool::getConnection();// ...DBConnectionPool::releaseConnection(conn);return 0;
}

9.跟踪对象数量: 使用静态数据成员来跟踪特定类的实例数量

在这里插入图片描述

代码

class ObjectCounter {
private:static int count; // 静态计数器,跟踪对象数量
public:ObjectCounter() {count++;}~ObjectCounter() {count--;}static int getCount() {return count;}
};int ObjectCounter::count = 0; // 初始化静态计数器int main() {ObjectCounter obj1, obj2, obj3;std::cout << "Total objects: " << ObjectCounter::getCount() << std::endl;// ...return 0;
}

10.全局事件处理: 使用静态函数成员来处理全局事件,如系统信号

在这里插入图片描述

代码

class EventHandler {
public:static void handleShutdownSignal() {// 处理关闭信号的逻辑}static void handleInterruptSignal() {// 处理中断信号的逻辑}
};int main() {// 注册信号处理函数std::signal(SIGINT, EventHandler::handleInterruptSignal);std::signal(SIGTERM, EventHandler::handleShutdownSignal);// ...return 0;
}

11.全局资源管理: 使用静态成员来管理全局资源,如文件句柄

在这里插入图片描述

代码

class ResourceManager {
private:static std::vector<FileHandle> openFiles; // 静态文件句柄列表
public:static FileHandle openFile(const std::string& filename) {FileHandle handle = openFileInternally(filename);openFiles.push_back(handle);return handle;}// ...
};std::vector<FileHandle> ResourceManager::openFiles; // 初始化文件句柄列表int main() {FileHandle file = ResourceManager::openFile("data.txt");// ...return 0;
}

12.全局配置管理: 使用静态成员来加载和管理全局配置信息

在这里插入图片描述

代码

class AppConfig {
private:static AppConfig instance; // 单例实例std::map<std::string, std::string> configData;AppConfig() {// 从配置文件加载配置数据}
public:static AppConfig& getInstance() {return instance;}std::string getConfigValue(const std::string& key) {return configData[key];}
};AppConfig AppConfig::instance; // 初始化单例实例int main() {std::string value = AppConfig::getInstance().getConfigValue("max_connections");// ...return 0;
}

13.回调-事件处理:在事件驱动的程序中,可以使用静态回调函数来响应特定事件

在这里插入图片描述

代码

class EventHandler {
public:static void onButtonClicked() {// 处理按钮点击事件的逻辑}static void onTextChanged(const std::string& newText) {// 处理文本变化事件的逻辑}
};int main() {Button button;button.setClickCallback(EventHandler::onButtonClicked);TextBox textBox;textBox.setTextChangeCallback(EventHandler::onTextChanged);// ...return 0;
}

14.回调-异步回调:在异步编程中,可以使用静态回调函数来处理异步任务完成的通知

在这里插入图片描述

运行
在这里插入图片描述

代码

#include <iostream>
#include <functional>
#include <thread>class AsyncTask {
public:typedef std::function<void(int result)> CompletionCallback;static int performActualTask(int input) {// 模拟耗时操作std::this_thread::sleep_for(std::chrono::seconds(2));return input * 2; // 模拟异步任务结果}static void performAsyncTask(int input, CompletionCallback callback) {std::thread([input, callback]() {int result = performActualTask(input);callback(result);}).detach();}
};int main() {int input = 42;AsyncTask::performAsyncTask(input, [](int result) {std::cout << "Async task completed with result: " << result << std::endl;});// 主线程继续执行其他操作std::cout << "Main thread continues..." << std::endl;// 等待一段时间,以确保异步任务完成std::this_thread::sleep_for(std::chrono::seconds(3));return 0;
}

15.回调-插件化架构: 在插件化架构中,可以使用静态回调函数来扩展和定制主程序的功能

在这里插入图片描述

运行
在这里插入图片描述

代码

#include <iostream>
#include <functional>
#include <vector>class Plugin {
public:typedef std::function<void()> ActionCallback;static void registerCustomAction(ActionCallback callback) {// 将回调函数注册为自定义动作customActions.push_back(callback);}static void executeCustomActions() {for (const ActionCallback& callback : customActions) {callback();}}private:static std::vector<ActionCallback> customActions;
};std::vector<Plugin::ActionCallback> Plugin::customActions;int main() {Plugin::registerCustomAction([]() {std::cout << "Custom action 1 executed." << std::endl;});Plugin::registerCustomAction([]() {std::cout << "Custom action 2 executed." << std::endl;});Plugin::executeCustomActions();// ...return 0;
}

16.回调-回调集中管理: 使用静态回调函数集中管理程序中的不同事件和处理逻辑

在这里插入图片描述

运行
在这里插入图片描述

代码

#include <iostream>
#include <functional>
#include <map>class CallbackManager {
public:typedef std::function<void()> Callback;static void registerCallback(const std::string& eventName, Callback callback) {eventCallbacks[eventName] = callback;}static void triggerEvent(const std::string& eventName) {auto it = eventCallbacks.find(eventName);if (it != eventCallbacks.end()) {(it->second)();}}private:static std::map<std::string, Callback> eventCallbacks;
};std::map<std::string, CallbackManager::Callback> CallbackManager::eventCallbacks;int main() {CallbackManager::registerCallback("start", []() {std::cout << "Start event triggered." << std::endl;});CallbackManager::registerCallback("stop", []() {std::cout << "Stop event triggered." << std::endl;});CallbackManager::triggerEvent("start");CallbackManager::triggerEvent("stop");// ...return 0;
}

相关文章:

C++笔记之静态成员函数的使用场景

C笔记之静态成员函数的使用场景 C静态成员函数的核心特点是不与特定类实例相关&#xff0c;可通过类名直接调用&#xff0c;用于执行与类相关的操作而无需创建类对象。其主要用途是在类级别上共享功能&#xff0c;管理全局状态或提供工具函数。 code review! 文章目录 C笔记之…...

Nginx的优化和防盗链

一、Nginx的优化 1、隐藏版本号 curl -I http://192.168.79.28 #查看信息&#xff08;版本号等&#xff09;方法一&#xff1a;修改配置文件 vim /usr/local/nginx/conf/nginx.conf vim /usr/local/nginx/conf/nginx.conf http {include mime.types;default_type ap…...

第二十次CCF计算机软件能力认证

数学专场 第一题&#xff1a;称检测点查询 解题思路&#xff1a;计算欧几里得距离 #include<iostream> #include<vector> #include<algorithm>using namespace std;typedef pair<int , int> PII; int n , x , y; vector<PII>v;int main() {ci…...

一篇文章带你了解Java发送邮件:使用JavaMail API发送电子邮件的注意事项、发送附件等

Java发送邮件&#xff1a;使用JavaMail API发送电子邮件 作者&#xff1a;Stevedash 发表于&#xff1a;2023年8月13日 15点48分 来源&#xff1a;Java 发送邮件 | 菜鸟教程 (runoob.com) 电子邮件在现代通信中扮演着至关重要的角色&#xff0c;而在Java编程中&#xff0c;…...

kubernetes的日志

1、日志在哪里 kubelet组件&#xff0c;systemd方式部署&#xff0c;journalctl -u kubelet 查看 其他组件&#xff0c;pod方式部署&#xff0c;kubectl logs 查看 容器运行时将日志写入 /var/log/pods 系统日志&#xff0c;/var/log/message 2、查看服务日志 #首先检查服…...

设计HTML5文本

网页文本内容丰富、形式多样&#xff0c;通过不同的版式显示在页面中&#xff0c;为用户提供最直接、最丰富的信息。HTML5新增了很多文本标签&#xff0c;它们都有特殊的语义&#xff0c;正确使用这些标签&#xff0c;可以让网页文本更严谨、更符合语义。 1、通用文本 1.1、标…...

msvcr120.dll丢失怎样修复?总结三个dll修复方法

当我遇到msvcr120.dll丢失的问题时&#xff0c;我感到有些困惑和焦虑。因为这个问题会导致我无法运行依赖这个文件的应用程序。msvcr120.dll是运行时库文件的一部分&#xff0c;为应用程序提供了必要的运行时支持。它的丢失会导致应用程序无法正常运行&#xff0c;这让我意识到…...

选择题方法论——颉斌斌

文章目录 一、仔细阅读文章结构Ⅰ 时间对比Ⅱ 抛砖引玉Ⅲ 开门见山Ⅳ 一分为二Ⅴ 两者关系Ⅵ 研究性文章 1 如何精准定位1.1 定位明显的题1.2 定位不明显的题1.3 定位找不到出题句的题 2 对比选项两点2.1 接收信息2.2 对比信息 3 选择题答案特点4 评估选项5 选择题的固有缺陷5.…...

23.8.8 杭电暑期多校7部分题解

1008 - H.HEX-A-GONE Trails 题目大意 有两个玩家和一棵树&#xff0c;初始状态玩家一和玩家二分别在两个点 x , y x,\space y x, y&#xff0c;每次操作可以走一个与当前点有连边并且双方都没走到过的点&#xff0c;问最后是谁赢 解题思路 因为不能走走过的点&#xff0c…...

《24海南大学835软件工程考研经验贴》

1.经验之谈 首先&#xff0c;我是一个二战的考生&#xff0c;一战给我带来的经验有几点。第一&#xff0c;数学、专业课这两门越早复习越好&#xff0c;越拖到后面你就会发现来不及了&#xff0c;这学不完&#xff0c;那学不完的。第二、我认为是比较关键的一点&#xff0c;一定…...

【yolo系列:运行报错AttributeError: module ‘torch.nn‘ has no attribute ‘Mish‘】

最近运行yolov7报错AttributeError: module ‘torch.nn‘ has no attribute ‘Mish‘ 网上搜罗了一系列的报错方法但是都不怎么好解决&#xff0c;那么在这里给出具体解决方法&#xff0c;以及一些别人的参考文章。 这里先解释自己的&#xff0c;然后再给出别人的相对应的报错…...

Leetcode 剑指 Offer II 039. 直方图最大矩形面积

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定非负整数数组 heights &#xff0c;数组中的数字用来表示柱状…...

SpringBoot案例-部门管理-修改

目录 前言 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文件 思路分析 功能接口开发 控制层&#xff08;Controller类&#xff09; 业务层&#xff08;Service类&#xff09; 业务类 业务实现类 持久层&#xff08;Mapper类&#xff09; 接口测试 前…...

element-ui表格数据为空,图片占位提示

当表格的绑定数据为空时常需要显示暂无数据等字样&#xff0c;这时候就用到了empty-text <el-table:data"tableData"stripeborderempty-text"暂无数据"> 但&#xff0c;当数据为空&#xff0c;想用图片展示呢&#xff0c;如下图 方法一&#xff1a…...

C++ STL vector 模拟实现

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C之STL &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;上次我们已经数字会用…...

51单片机学习--红外遥控(外部中断)

需要利用下面这个红外接收头&#xff0c;OUT口会发出红外信号对应的高低电平&#xff0c;由于发送的速度很快&#xff0c;所以需要把OUT引脚接在外部中断引脚上&#xff0c;当OUT一旦产生下降沿&#xff0c;马上进中断&#xff0c;这样响应会更及时。 外部中断引脚位于P3_2和P…...

后端开发10.规格模块

概述 简介 效果图...

腾讯出了一个新聊天软件M8

众所周知&#xff0c;如今国内互联网&#xff0c;微信和QQ无疑是社交领域的霸主。 下载:https://www.123pan.com/s/BP5A-RW4xh.html 不过&#xff0c;它们也有各自局限性&#xff0c;比如难以结识新朋友、功能过于复杂等。 这让用户产生厌倦&#xff0c;再加上近几年AI、元宇…...

C++ QT(一)

目录 初识QtQt 是什么Qt 能做什么Qt/C与QML 如何选择Qt 版本Windows 下安装QtLinux 下安装Qt安装Qt配置Qt Creator 输入中文配置Ubuntu 中文环境配置中文输入法 Qt Creator 简单使用Qt Creator 界面组成Qt Creator 设置 第一个Qt 程序新建一个项目项目文件介绍项目文件*.pro样式…...

微信小程序时钟

微信小程序自定义时钟&#xff0c;模拟翻牌时钟。1、页面布局 <view class"date-time-box"><view class"date-box">{{nowDate}}</view><view class"time-box"><view><image class"pic01 {{move[0]?move…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...