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

effective c++ item 25-29

item25:自定义swap函数

namespace std{template<typename T>void swap(T& a, T& b){T temp(a);		// T要满足拷贝构造和拷贝赋值a = b;b = temp;		}
}

1、Pimpl

2、自定义swap

item26:尽可能延后变量的定义

case 1:
temp j;
for(int i = 0; i < n; ++ i){j = func(i);
}case 2:
for(int i = 0; i < n; ++ i){temp j(i);
}

方案1调用了1次构造、1次析构和n次赋值
方案2调用了n次构造和n次析构
如果对程序效率不敏感,则方案2更好

item27:正确使用类型转换

1、c语言

(T) expression;
T(expression);

2、static_cast<T>(expression)

int x, y;
double d = static_cast<double> (x) / y;// 自定义变量
class Widget{
public:explicit Widget(int size);
};
void dosomework(const Widget& w);dosomework(Widget(15));			// function-style cast
dosomework(static_cast<Widget>(15));	// c++ style cast
#include <iostream>
using namespace std;class Base{
public:int a;
};class Derived:public Base{
public:double c;virtual void bar(){}
};void test(Base* base, Derived* derived){printf("%p, %p", base, derived);				// 0x16fab2c58, 0x16fab2c50printf("%p\n", static_cast<Base*>(derived));	// 0x16fab2c58if(base == static_cast<Base*>(derived)){cout << "==" << endl;						// == }else{cout << "!=" << endl;}
}int main(){Derived derived;test(&derived, &derived);	return 0;
}

类中含有虚指针,8个字节,staticcast会移动类的指针

3、dynamic_cast<T> ()

在运行时类型转换,开销很大

4、const_cast<T>()

5、reinterpret_cast<T>()

item28:以引用的方式返回对象的成员

1、注意访问级别

以引用的方式返回的成员需要注意,因为可能会提高他的访问级别,导致被外部修改

class Point{
public:Point(int x, int y);void setX(int newVal);void setY(int newVal);
};struct RectData{Point ulhc;		// upper left-hand cornerPoint lrhc;		// lower right-hand corner
};class Rectangle{
public:Point& upperLeft() const { return pData->ulhc;}		// const承诺不修改其中的成员变量Point& lowerRight() const{ return pData->lrhc;}
private:std::shared_ptr<RectData> pData;
};int main(){Point coord1(0, 0);Point coord2(100, 100);const Rectangle rec(coord1, coord2);		// const表示成员状态不会变rec.upperLeft().setX(50);		// 由于upperLeft返回的是引用,再调用setx就把成员状态更改了
}

为了防止上边那种意料之外的修改,我们可以这样更改:

class Rectangle{
public:const Point& upperLeft() const { return pData->ulhc;}	// 增加const,返回一个const的指针const Point& lowerRight() const{ return pData->lrhc;}
private:std::shared_ptr<RectData> pData;
};

2、访问未定义内存

class GUIObject {...};
const Rectangle boundingBox(const GUIObject& obj);GUIObject *pgo;		// make pgo point to some GUIObject
const Point *pUperLeft = &(boundingBox(*pgo).upperLeft()); // 返回一个临时变量的地址,在临时变量被释放后,操作pUperLeft会导致未定义行为// 应当用一个变量接收
auto bbox = boundingBox(*pgo);
const Point* pUpperLeft = &(bbox.uperLeft());

item29:努力写出异常安全的代码

class Menu{Mutex mutex;Image *bgImage;int imageChanges;
public:void changeBackground(std::istream& imgSrc);
};void Menu::changeBackground(std::istream& imgSrc){lock(&mutex);delete bgImage;++ imageChanges;bgImage = new Image(imgSrc);	// 如果这一步没有new成功,会导致资源泄漏(锁未释放)、数据损坏(背景被删除、改变次数+1)unlock(&mutex);
}

异常安全(exception-safe functions):

  • leak no resources
  • dont allow data structures to become corrupted

上面的代码应该这样修改:

class Menu{Mutex mutex;std::shared_ptr<Image> bgImage;int imageChanges;
public:void changeBackground(std::istream& imgSrc);
};void Menu::changeBackground(std::istream& imgSrc){Lock ml(&mutex);		// item14:acquire mutex and ensure its later release(RAII)bgImage.reset(new Image(imgSrc));++ imageChanges;
}

相关文章:

effective c++ item 25-29

item25&#xff1a;自定义swap函数 namespace std{template<typename T>void swap(T& a, T& b){T temp(a); // T要满足拷贝构造和拷贝赋值a b;b temp; } }1、Pimpl 2、自定义swap item26:尽可能延后变量的定义 case 1: temp j; for(int i 0; i < n; …...

MasterCAM实体旋转命令相关几个问题:曲线相交于边缘等

MasterCAM版本&#xff1a;2022 目的&#xff1a;通过旋转画杯子边缘主体 内外环直径分别是&#xff1a;56、60mm 命令&#xff1a;实体 - 旋转 问题&#xff1a; 一、处理实体期间错误parasolid(r) kernel 界面错误PK 错误代码&#xff1a;942-曲线相交于边缘 对应参数&a…...

p标签需要设置宽高吗?不用

Dusk: # 引用补丁&#xff0c;开头必须以 -javaagent: 开头&#xff0c;后面跟着补丁的绝对路径&#xff08;可根据你实际的位置进行修改&#xff09;,注意路径一定要填写正确&#xff0c;且不能包含中文&#xff0c;否则会导致 IDEA 无法启动-javaagent:D:/ja-netfilter/ja-ne…...

Andorid 事件分发机制案例实操与解析

文章目录为什么要理解Android事件分发机制&#xff1f;滑动冲突类问题我们以什么开始&#xff1f;代码如下&#xff1a;activity xml 代码&#xff1a;Activity代码&#xff1a;item_user.xml代码修改后代码如下&#xff1a;Activity xmlactivity代码item_gift.xml问题出现了An…...

Git 版本控制/项目迭代

一、Git的作用/为什么要进行版本控制&#xff1f; 什么是项目迭代&#xff1f; 搞开发的时候我们不是一次性就做好平台的所有功能&#xff0c;而是先上线一个功能差不多的版本让用户用着&#xff0c;然后不断迭代、修改&#xff0c;上线新的版本&#xff0c;所以一个项目就会…...

智慧农业大数据项目建设方案

智慧农业大数据项目建设方案 目录 项目概述.................................... 6...

【数据结构专栏】动态扩容顺序栈详解

&#x1f48c; 博客内容&#xff1a;顺序栈的原理详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前段&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这…...

Linux命令·ifconfig

许多windows非常熟悉ipconfig命令行工具&#xff0c;它被用来获取网络接口配置信息并对此进行修改。Linux系统拥有一个类似的工具&#xff0c;也就是ifconfig(interfaces config)。通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使…...

大器晚成我服刘邦,48岁才开始创业

读史使人明智&#xff0c;周末放下手机&#xff0c;静下心来读点人文历史。大器晚成我最佩服刘邦&#xff0c;48岁才开始创业 。在此之前&#xff0c;他是一个出身平凡的农民&#xff0c;早年曾多次失败和受挫。刘邦最后能够战胜项羽&#xff0c;常常让人觉得匪夷所思&#xff…...

AndroidStudio快捷键

动态演示&#xff1a;https://blog.csdn.net/weixin_67276852/article/details/124159843?spm1000.2115.3001.6382&utm_mediumdistribute.pc_feed_v2.none-task-blog-hot-11.pc_personrec&depth_1-utm_sourcedistribute.pc_feed_v2.none-task-blog-hot-11.pc_personre…...

机械硬盘的工作原理

每个磁盘的表面都有高速扫过的记录磁头。 每个磁盘上都覆盖着一层薄薄的微小的磁化金属粒。 数据以一种肉眼无法分辨的形式存在。很多组微小颗粒形成的磁化图案记录形成了数据。每一组&#xff0c;又称之为比特&#xff08;bit&#xff09;。 所有微粒都按照自身的磁性排列…...

掌握TypeScript:10个最佳实践提高代码质量

TypeScript 是一种强类型的 JavaScript 超集&#xff0c;提供了很多优秀的工具和语言特性&#xff0c;可以帮助开发者提高代码质量和开发效率。在本文中&#xff0c;我们将介绍 10 个 TypeScript 最佳实践&#xff0c;帮助初级和中级的 Web 前端开发工程师更好地使用 TypeScrip…...

【面试】Kafka面试题

文章目录1、Kafka是什么&#xff1f;2、partition的数据文件&#xff08;offffset&#xff0c;MessageSize&#xff0c;data&#xff09;3、数据文件分段 segment&#xff08;顺序读写、分段命令、二分查找&#xff09;4、负载均衡&#xff08;partition会均衡分布到不同broker…...

【C++学习】map和set的使用

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; map和set的使用&#x1f308;关联式容器⚡键对值&#x1f308;set⚡构造函数⚡增删查改&#x1f308;…...

企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…...

4.6--计算机网络之TCP篇之TCP的连接建立--(复习+深入)---好好沉淀,加油呀

1.TCP 三次握手过程是怎样的&#xff1f; TCP 是面向连接的协议&#xff0c;所以使用 TCP 前必须先建立连接&#xff0c;而建立连接是通过三次握手来进行的 1.一开始&#xff0c;客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口&#xff0c;处于 LISTEN 状态 2…...

Pytorch 数据产生 DataLoader对象详解

目录 1、Pytorch读取数据流程 2、DataLoader参数 3、DataLoader&#xff0c;Sampler和Dataset 4、sampler和batch_sampler 5、源码解析 6、RandomSampler(dataset)、 SequentialSampler(dataset) 7、BatchSampler(Sampler) 8、总结 9、自定义Sampler和BatchSampler 研…...

Linux文件系统介绍

一、简介 文件系统就是分区或磁盘上的所有文件的逻辑集合。 文件系统不仅包含着文件中的数据而且还有文件系统的结构&#xff0c;所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。 不同Linux发行版本之间的文件系统差别很少&#xff0c;主要表现在…...

Java高频必背面试题基础篇02

一、Java 语⾔中关键字 static 的作⽤是什么&#xff1f; static 的主要作⽤有两个&#xff1a; &#xff08;1&#xff09;为某种特定数据类型或对象分配与创建对象个数⽆关的单⼀的存储空间。 &#xff08;2&#xff09;使得某个⽅法或属性与类⽽不是对象关联在⼀起&#xf…...

蓝桥杯—stm32g431rbt6串口中断和定时器输出pwm学习

目录 串口中断 定时器中断 输出pwm 串口中断 配置异步模式&#xff0c;使能中断&#xff0c;选择波特率。 串口接收中断开启 HAL_UART_Receive_IT(&huart1,data, 3); 回调函数&#xff1a; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huar…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...