单件s_instance作为类成员静态变量与函数静态局部变量的区别

在C++中,静态成员变量和静态局部变量虽然都是静态的,但它们的作用和使用方式有明显的区别:

1. **静态成员变量**:
   - 静态成员变量是类的一部分,它是类的所有实例对象共享的,只有一份拷贝。通常在类的声明中定义,然后在类的定义文件中初始化。
   - 静态成员变量可以通过类名::成员名的方式访问,也可以在类的静态成员函数中使用。
   - 静态成员变量的生命周期与程序的生命周期相同,直到程序结束时才被销毁。

2. **静态局部变量**:
   - 静态局部变量是在函数内部声明为静态的变量,它们在函数第一次被调用时初始化,并且只初始化一次。它们在函数执行结束后并不会被销毁,而是保留其值直到程序结束。
   - 静态局部变量对外部是不可见的,只能在其声明所在的函数内部访问。
   - 静态局部变量适合于需要在函数中保持状态或者进行延迟初始化的情况。

**区别总结**:
- **可见性和作用域**:静态成员变量是类的一部分,可以被类的所有实例和静态成员函数访问;静态局部变量仅在声明所在的函数内部可见。
- **生命周期**:静态成员变量的生命周期与程序运行周期相同;静态局部变量的生命周期从第一次调用开始到程序结束。
- **初始化时机**:静态成员变量在类的定义文件中进行初始化;静态局部变量在函数第一次调用时进行初始化。

在实际编程中,选择使用静态成员变量还是静态局部变量取决于需求,静态成员变量适合需要在整个类范围内共享的情况,而静态局部变量适合于函数内部需要保持状态或者进行延迟初始化的情况。

1.

#include <iostream>class Singleton {
private:static Singleton* s_instance; // 静态成员变量,用于存储单例对象指针// 私有构造函数,防止外部实例化Singleton() {}public:// 静态成员函数,用于获取单例对象实例static Singleton* getInstance() {if (s_instance == nullptr) {s_instance = new Singleton();}return s_instance;}void showMessage() {std::cout << "Hello, I am a singleton object!" << std::endl;}
};// 初始化静态成员变量
Singleton* Singleton::s_instance = nullptr;int main() {// 获取单例对象实例Singleton* singleton1 = Singleton::getInstance();singleton1->showMessage();// 尝试获取单例对象的另一个实例,应该返回相同的对象Singleton* singleton2 = Singleton::getInstance();singleton2->showMessage();return 0;
}

2.

#include <iostream>class Singleton {
private:// 私有构造函数,防止外部实例化Singleton() {}public:// 静态成员函数,用于获取单例对象实例static Singleton& getInstance() {static Singleton instance; // 静态局部变量,确保只初始化一次return instance;}void showMessage() {std::cout << "Hello, I am a singleton object!" << std::endl;}
};int main() {// 获取单例对象实例Singleton& singleton1 = Singleton::getInstance();singleton1.showMessage();// 尝试获取单例对象的另一个实例,应该返回相同的对象Singleton& singleton2 = Singleton::getInstance();singleton2.showMessage();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45209.shtml

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

相关文章

虚拟机 VMware Workstation- 安装详细步骤

目录 虚拟化概念VMware Workstation 简介一、安装准备1. 安装环境2. 软件下载 二、常见问题1. 虚拟机的【默认位置】会在C盘&#xff0c;盘符内存不够的建议改为D盘或别的盘符2. 验证许可证是否密钥是否成功。进入虚拟机点击【帮助】下的关于VMware Workstation(A)可以查看验证…

YOLOv10改进 | 主干/Backbone篇 | 利用RT-DETR特征提取网络PPHGNetV2改进YOLOv10

一、本文介绍 本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv10的主干&#xff0c;RT-DETR是今年由百度推出的第一款实时的ViT模型&#xff0c;其在实时检测的领域上号称是打败了YOLO系列&#xff0c;其利用两个主干一个是HGNet一个是ResNet&#xff0c;其中HGNet就是我们…

Java项目中,常用的SQL语句

常用的命令&#xff1a; 1.数据的增删改查 1.插入数据(进行注册&#xff09; 语法 1&#xff1a; --第一种&#xff1a; INSERT INTO 表名(列名 1,列名 2, …) ; insert into tablename(member1,member3) valuse(,); --第二种&#xff1a; INSERT INTO 表名 VALUES(值 1,值 …

Python编程实例-Python的隐藏特性

Python的隐藏特性 文章目录 Python的隐藏特性1、Python中的下划线(_)2、通过解析树进行正则表达式调试3、省略号(...)4、dir()函数5、Lambda 函数6、链式比较运算符7、zip()函数8、修饰器9、上下文管理器和with语句10、生成器和yield语句11、元类(Metaclass)12、小结Python…

MySQL版本升级

MySQL版本升级 升级说明 MySQL升级的实质 对数据字典的升级 数据字典有&#xff1a;mysql、information_schema、performance_schema、sys schema。 MySQL升级的两种方式 大版本升级&#xff08;需要考虑业务的可用性&#xff09; 5.6 to 5.75.6 to 8.05.7 to 8.0 小版…

使用大模型进行SQL迁移的实践总结

在现代化的项目管理和运维工作中&#xff0c;利用大模型&#xff08;如ChatGPT&#xff09;处理复杂任务已成为一种高效手段。近期我们在一个项目中尝试利用大模型将MySQL导出的SQL语句迁移为达梦信创数据库格式&#xff0c;通过几轮操作&#xff0c;我们深刻体会到提示词工程的…

旷野之间4 - 100 个 Kubernetes 面试问题及答案

100 个 Kubernetes 面试问题及答案 Kubernetes 简介 什么是 Kubernetes&#xff1f; Kubernetes 是一个开源容器编排平台&#xff0c;可自动部署、扩展和管理容器化应用程序。 什么是容器&#xff1f; 容器是一个轻量级、独立的、可执行软件包&#xff0c;其中包含运行应用…

QT--槽函数和控件篇一

一、自定义信号和槽函数 QT 将信号和槽集成在QObject类中&#xff1b;发送者和接受者都必须继承这个类。Q_OBJECT宏是实现信号和槽机制、属性系统和元对象系统的关键。Q_OBJECT宏必须出现在每个使用信号和槽的类中&#xff0c;因为它为这些类提供了必要的元数据和功能。信号在…

mindspore打卡23天之基于MobileNetv2的垃圾分类函数式自动微分

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&a…

从0开始的STM32HAL库学习5

旋转编码计数器 修改中断代码 void EXTI0_IRQHandler(void) {/* USER CODE BEGIN EXTI0_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(PB0_Pin)){if(HAL_GPIO_ReadPin(PB1_GPIO_Port, PB1_Pin)GPIO_PIN_RESET){count--;}/* USER CODE END EXTI0_IRQn 0 */HAL_GPIO_EXTI_IRQHandler…

php file_get_contents https 请求 伪造user_agent

在PHP中&#xff0c;使用file_get_contents()函数来发起HTTPS请求时&#xff0c;可以通过设置HTTP请求头来伪造User-Agent。file_get_contents()函数本身不直接支持设置请求头&#xff0c;可以通过上下文&#xff08;context&#xff09;参数来实现这一点。 // 目标URL $url …

Java技术栈总结:容器集合篇

一、List 1、ArrayList &#xff08;1&#xff09;底层数据结构 底层数据结构为数组。数组是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 Q&#xff1a;为什么数组索引下标从0开始&#xff1f; A&#xff1a;从0开始&#xff0c;对应寻址公式&#xff1a;a[i]…

Vuetify3 + Nuxt3:跳转详情

在Nuxt 3中&#xff0c;使用v-data-table组件时&#xff0c;我们想要在点击某个行或者某个单元格时进行页面跳转。可以通过监听组件的点击事件&#xff0c;并使用useRouter来实现页面跳转。 <template><v-data-table:headers"headers":items"items&qu…

dolphinScheduler + hive + datax报错记录

1、参数错误 报错信息 [INFO] 2024-04-11 06:43:18.386 - [taskAppIdTASK-29-3301-84461]:[498] - after replace sql , preparing : insertoverwrite table mis_month partition (dt) select nvl(sl.slid , ) as id,--水量 IDnvl(sl.hh …

MongoDB教程(二):mongoDB引用shell

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

了解AsyncRotationController

概述 基于android 15.0, 以从强制横屏App上滑退回桌面流程来分析 frameworks/base/services/core/java/com/android/server/wm/AsyncRotationController.javaAsyncRotationController 是一种控制器&#xff0c;用于处理设备显示屏旋转时非活动窗口的异步更新。这种控制器通过…

设计模式——适配器设计模式

设计模式——适配器设计模式 适配器设计模式1.1 基本介绍1.2 工作原理1.3 类适配器模式1.3.1 基本介绍1.3.2 示例1.3.3 代码实现1.3.4 注意事项 1.4 对象适配器模式1.4.1 基本介绍1.4.2 示例1.4.3 代码实现1.4.4 注意事项 1.5 接口适配器模式1.5.1 基本介绍1.5.2 示例1.5.3 代码…

如何处理Java中数据结构(如HashMap)导致的性能瓶颈

在Java开发过程中&#xff0c;HashMap 是一种常用的数据结构&#xff0c;它提供了高效的键值对存储和快速的查找、插入和删除操作。然而&#xff0c;在某些情况下&#xff0c;HashMap 可能会导致性能瓶颈。本文将探讨这些性能瓶颈的成因&#xff0c;并提供一些优化策略。 一、…

Webkit简介以及工作流程

Webkit简介 WebKit是一个开源的浏览器引擎&#xff0c;最初由苹果公司基于KHTML&#xff08;K Desktop Environment的HTML渲染引擎&#xff09;开发&#xff0c;并广泛应用于Safari浏览器。随着时间的推移&#xff0c;WebKit也被其他多款浏览器和应用所采用&#xff0c;成为We…

pudb: Python的图形化调试器

文章目录 pudb原理基础使用安装pudb启动pudb界面介绍常用操作 高级使用条件断点表达式求值自定义布局搜索和过滤插件和扩展 结论 pudb原理 pudb是一个基于文本的图形化Python调试器&#xff0c;它结合了pdb的强大调试功能与图形用户界面的易用性。pudb通过提供一个可视化的界面…