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

Effective C++(二):对象的初始化

文章目录

  • 一、类的初始化
  • 二、全局静态对象的初始化


一、类的初始化

对于类中的成员变量的初始化,一般有两种方法,一种是在类中定义的时候直接赋予初值:

class CTextBlock {
private:std::size_t textLength{ 0 };bool lenisValid{ false }:
};

另一种是在构造成员函数中初始化列表,在使用这个方法的时候需要注意初始化列表中各个变量的顺序应该和类中各个成员变量声明的顺序一致:

ABEntry::ABEntry(const std::string& name, const std::string& address,const std::list<PhoneNumber>& phones): theName(name),theAddress(address),thePhones(phones),numTimesConsulted(0) {}
成员初始化列表也可以留空用来执行默认构造函数:ABEntry::ABEntry(): theName(),theAddress(),thePhones(),numTimesConsulted(0) {}

二、全局静态对象的初始化

静态对象的初始化一直是一个比较棘手的问题。这是由于 C++对于定义在不同编译单元中的全局静态对象的初始化的相对次序并没有明确定义,因此,下列代码可能会出现使用未初始化静态对象的情况

//File 1 
extern FileSystem tfs;//File 2
class Directory {
public:Directory() {FileSystem disk = tfs;}
};Directory tempDir; 

在这个例子中,你不能保证位于不同编译单元内的 tfs 一定会在 tempDir 之前完成初始化。 为了解决这个问题,可以使用一个叫做迈尔单例模式, 源自于 Effective C++一书的作者迈尔,将全局静态对象转化为局部静态对象

FileSystem& tfs() {static FileSystem fs;return fs;
}Directory& tempDir() {static Directory td;return td;
}//同时应该把Directory的构造函数改造成:
FileSystem disk = tfs(); 

这种做法的好处在于函数内的局部静态对象 td 会在该函数 tempDir被调用的时候被初始化,fs也只会在 tfs()被调用的时候被初始化,不仅让静态变量初始化的顺序可控,而且节省了资源,在没有必要创建他们的时候不进行类变量的创建。

请注意

在多线程环境中,静态局部变量的初始化可能引发线程安全问题。尽管 C++11 标准确保了函数内静态局部变量的线程安全初始化(即在多线程环境下,静态局部变量仅被初始化一次),但这种机制可能导致性能问题,因为每次访问这些变量时都需要进行线程安全检查。

为了避免这种开销和潜在的线程安全问题,一种常见做法是在程序的单线程启动阶段(即在多线程被创建之前)手动初始化这些静态局部变量。这样做可以确保在任何线程开始执行之前,所有需要的静态局部变量都已正确初始化。举一个🌰:

假设我们需要在多线程环境下实现一个 logger 类:

class Logger {
public:static Logger& getInstance() {static Logger instance;return instance;} void log(const std::string& message) {//print(message)...} Logger(const Logger&)=delete;Logger& operator=(const Logger&)=delete;

请注意,在这个单例模式下,我们一般不会在=运算符重载函数下面加上 const, 这是因为这会阻止链式调用,所谓的链式调用,比如:

Type a, b, c;
a = b = c; 在这里上列的语句也可以修改为: 
a = (b = c); 
在这里,如果 b = c返回的是一个 const Logger& ,那就不能赋值给 a,因为 a 需要的是一个非常量引用。

相关文章:

Effective C++(二):对象的初始化

文章目录 一、类的初始化二、全局静态对象的初始化 一、类的初始化 对于类中的成员变量的初始化&#xff0c;一般有两种方法&#xff0c;一种是在类中定义的时候直接赋予初值&#xff1a; class CTextBlock { private:std::size_t textLength{ 0 };bool lenisValid{ false }:…...

云原生高级--shell自动化脚本备份

shell自动化脚本实战---备份 数据库备份&#xff1a; 结合计划任务 MySQL、 Oracle 网站备份&#xff1a; tar&#xff0c;异地保存--ftp、rsync 一、数据库备份 1.利用自带工具mysqldump 实现数据库分库备份 分库备份&#xff1a; 1> 如何获取备份的…...

Spring Boot实现热部署

Spring Boot提供了一个名为spring-boot-devtools的开发工具&#xff0c;它可以实现热部署功能。通过使用spring-boot-devtools&#xff0c;可以在修改了resources目录下的内容后&#xff0c;自动重新加载应用程序&#xff0c;而无需手动重启。 以下是使用spring-boot-devtools…...

MVCC-

文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 1. 什么是MVCC 口述&#xff1a;MVCC其实他是解决这种读-写的情况的&#xff0c;当然读-写也可以用 锁来…...

键盘打字盲打练习系列之刻意练习——1

一.欢迎来到我的酒馆 盲打&#xff0c;刻意练习! 目录 一.欢迎来到我的酒馆二.选择一款工具三.刻意练习第一步&#xff1a;基准键位练习第二步&#xff1a;字母键位练习第三步&#xff1a;数字符号键位练习 四.矫正坐姿 二.选择一款工具 工欲善其事必先利其器。在开始之前&…...

某公司前端笔试题(12.30)

1、对象数组去重&#xff1a; 数组去重&#xff1a; const a[{a:1,b:2},{a:2},{a:2},{a:1,c:3},{b:2,a:1}] 结果&#xff1a;[{a:1,b:2},{a:2},{a:1,c:3}] // 判断两个对象的属性值是否一致 const a [{ a: 1, b: 2 }, { a: 2 }, { a: 2 }, { a: 1, c: 3 }, { b: 2, a: 1 }] co…...

Sentinel核心类解读:Node

基本介绍 Sentinel中的簇点链路是由一个个的Node组成的&#xff0c;Node是一个接口。Node中保存了对资源的实时数据的统计&#xff0c;Sentinel中的限流或者降级等功能就是通过Node中的数据进行判断的。 Sentinel中是这样描述Node的&#xff1a; Holds real-time statistics…...

网络安全领域的12个大语言模型用例

网络安全是人工智能最大的细分市场&#xff0c;过去几年网络安全厂商纷纷宣称整合了人工智能技术&#xff08;当然也有很多仅仅是炒作&#xff09;&#xff0c;其中大部分是基于基线和统计异常的机器学习。 随着ChatGPT和类似生成式人工智能技术的飞速发展&#xff0c;基于大语…...

十大网络攻击手段解析,助您建立坚固的网络防线

在互联网高度发达的今天&#xff0c;网络安全问题愈发严峻。 了解网络攻击手段&#xff0c;掌握防御策略&#xff0c;对保障网络安全至关重要。 本文将为您介绍常见的十大网络攻击手段&#xff0c;以及如何应对和防御这些攻击手段&#xff0c;确保网络安全。 一、DDoS攻击 …...

jvm 调优参数

-XX:AlwaysPreTouch 指定JVM启动时即刻分配整个堆内存空间&#xff1b;应用启动会变慢&#xff0c;但是运行时变快。 -XX:MaxRAMPercentage60.0 指定JVM最大堆内存使用比例为60%&#xff1b;适用于容器部署 -XX:MinRAMPercentage60.0 指定JVM最小堆内存使用比例为60%&#xff1…...

OpenCV-Python:计算机视觉介绍

目录 1.背景 2.计算机视觉发展历史 3.计算机视觉主要任务 4.计算机视觉应用场景 5.知识笔记 1.背景 OpenCV是计算机视觉的一个框架&#xff0c;想要学习OpenCV&#xff0c;需要对计算机视觉有一个大致的了解。计算机视觉是指通过计算机技术和算法来模拟人类视觉系统的能力…...

uni-app 微信小程序之自定义中间圆形tabbar

文章目录 1. 自定义tabbar效果2. pages新建tabbar页面3. tabbar 页面结构4. tabbar 页面完整代码 1. 自定义tabbar效果 2. pages新建tabbar页面 首先在 pages.json 文件中&#xff0c;新建一个 tabbar 页面 "pages": [ //pages数组中第一项表示应用启动页&#xff…...

使用 Go 构建高性能的命令行工具

命令行工具&#xff08;CLI&#xff09;在软件开发中扮演着重要的角色&#xff0c;尤其是在自动化工具、开发工具链和服务器管理等领域。Go 语言以其简洁性和高性能而闻名&#xff0c;非常适合用来创建强大且高效的 CLI 工具。本文将详细介绍如何使用 Go 语言来构建 CLI 应用&a…...

微前端框架 qiankun

前言 qiankun是一个基于single-spa的微前端实现库&#xff0c;帮助你构建一个生产可用的微前端架构系统。qiankun支持多种技术栈的微应用接入&#xff0c;提供了简单、解耦、技术栈无关、独立开发、独立运行、增量升级、样式隔离、资源预加载等特性&#xff0c;以及umi插件一键…...

降序子数组最大和算法分析

题目描述&#xff1a; Description 给你一个正整数组成的数组 nums &#xff0c;返回 nums 中一个 降序 子数组的最大可能元素和。子数组是数组中的一个连续数字序列。 已知子数组[numsl​,numsl1​,...,numsr−1​,numsr​]&#xff0c;若对所有 i&#xff08;l < i <…...

Kafka常见面试题

如何防止消息丢失&#xff1f; 发送端&#xff1a;ack设置为-1或副本数&#xff0c;默认副本全部同步才会认为发送成功 接收端&#xff1a;对接收到的数据进行备份&#xff0c;定期进行检查对执行失败的数据重新执行&#xff1b;选择手动提交offset&#xff0c;对执行失败的数据…...

rman SBT_TAPE NFS disk 模拟NBU带库 FRA

-----------------rman 将本地磁盘变成磁带----------------------------------- ##RAC 本地 /nfs----两个备份策略 clustern run { allocate channel ch00 device type SBT_TAPE PARMS"SBT_LIBRARYoracle.disksbt, ENV(BACKUP_DIR/nfs)"; backup recove…...

物理世界中的等距3D对抗样本

论文题目&#xff1a;Isometric 3D Adversarial Examples in the Physical World 会议&#xff1a;NIPS 2022 点云&#xff1a; 点云——表达目标空间分布和目标表面特性的海量点集合&#xff0c;点包含xyz坐标信息 能够包含颜色等其他信息 使用顶点、边和面的数据表征的三维…...

解决vue3项目打包发布到服务器后访问页面显示空白问题

1.在 vite.config.ts 文件中 加入 base:./ 当你将 base 设置为 / 时&#xff0c;它表示你的应用程序将部署在服务器的根路径上&#xff0c;&#xff08;将 base 设置为 / 表示你的应用程序部署在服务器的根路径上&#xff0c;并且 Vite 会相应地处理资源和路由的路径…...

什么是SMTP服务器?如何配置?

SMTP服务器是一种专门用于发送电子邮件的互联网服务器。SMTP&#xff08;Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议&#xff09;是一种用于电子邮件传输的标准互联网协议。这些服务器充当电子邮件的“邮递员”&#xff0c;负责将发出的邮件从发送者传输到接收…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...