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

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

Andorid 事件分发机制案例实操与解析
文章目录为什么要理解Android事件分发机制?滑动冲突类问题我们以什么开始?代码如下:activity xml 代码:Activity代码:item_user.xml代码修改后代码如下:Activity xmlactivity代码item_gift.xml问题出现了An…...

Git 版本控制/项目迭代
一、Git的作用/为什么要进行版本控制? 什么是项目迭代? 搞开发的时候我们不是一次性就做好平台的所有功能,而是先上线一个功能差不多的版本让用户用着,然后不断迭代、修改,上线新的版本,所以一个项目就会…...
智慧农业大数据项目建设方案
智慧农业大数据项目建设方案 目录 项目概述.................................... 6...

【数据结构专栏】动态扩容顺序栈详解
💌 博客内容:顺序栈的原理详解 😀 作 者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前段,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这…...

Linux命令·ifconfig
许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改。Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config)。通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使…...
大器晚成我服刘邦,48岁才开始创业
读史使人明智,周末放下手机,静下心来读点人文历史。大器晚成我最佩服刘邦,48岁才开始创业 。在此之前,他是一个出身平凡的农民,早年曾多次失败和受挫。刘邦最后能够战胜项羽,常常让人觉得匪夷所思ÿ…...
AndroidStudio快捷键
动态演示: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…...

机械硬盘的工作原理
每个磁盘的表面都有高速扫过的记录磁头。 每个磁盘上都覆盖着一层薄薄的微小的磁化金属粒。 数据以一种肉眼无法分辨的形式存在。很多组微小颗粒形成的磁化图案记录形成了数据。每一组,又称之为比特(bit)。 所有微粒都按照自身的磁性排列…...
掌握TypeScript:10个最佳实践提高代码质量
TypeScript 是一种强类型的 JavaScript 超集,提供了很多优秀的工具和语言特性,可以帮助开发者提高代码质量和开发效率。在本文中,我们将介绍 10 个 TypeScript 最佳实践,帮助初级和中级的 Web 前端开发工程师更好地使用 TypeScrip…...

【面试】Kafka面试题
文章目录1、Kafka是什么?2、partition的数据文件(offffset,MessageSize,data)3、数据文件分段 segment(顺序读写、分段命令、二分查找)4、负载均衡(partition会均衡分布到不同broker…...

【C++学习】map和set的使用
🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! map和set的使用🌈关联式容器⚡键对值🌈set⚡构造函数⚡增删查改🌈…...

企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标
功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外…...

4.6--计算机网络之TCP篇之TCP的连接建立--(复习+深入)---好好沉淀,加油呀
1.TCP 三次握手过程是怎样的? TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的 1.一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态 2…...

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

Linux文件系统介绍
一、简介 文件系统就是分区或磁盘上的所有文件的逻辑集合。 文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。 不同Linux发行版本之间的文件系统差别很少,主要表现在…...
Java高频必背面试题基础篇02
一、Java 语⾔中关键字 static 的作⽤是什么? static 的主要作⽤有两个: (1)为某种特定数据类型或对象分配与创建对象个数⽆关的单⼀的存储空间。 (2)使得某个⽅法或属性与类⽽不是对象关联在⼀起…...

蓝桥杯—stm32g431rbt6串口中断和定时器输出pwm学习
目录 串口中断 定时器中断 输出pwm 串口中断 配置异步模式,使能中断,选择波特率。 串口接收中断开启 HAL_UART_Receive_IT(&huart1,data, 3); 回调函数: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huar…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

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 …...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...