当前位置: 首页 > 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…...

zed驱动的安装 及 遇到问题 及 ros标定

安装zed相机驱动 zed驱动官网 下载.run文件 chmod x ZED_SDK_Ubuntu18_cuda10.2_v4.0.1.zstd.run #换自己的版本号 ./ZED_SDK_Ubuntu18_cuda10.2_v4.0.1.zstd.run #换自己的版本号当遇到 zstd: not found … Decompression failed. 重新安装&a…...

打车代驾顺风车货车租运系统开发功能(司机端)

随着社会经济水平的提高&#xff0c;人们对于打车代驾服务要求也不断提高&#xff0c;更多的人愿意在手机上通过打车代驾APP小程序软件来预约叫车&#xff0c;选择打车代驾服务。打车代驾软件开发是基于广大用户的要求而产生的新型服务方式&#xff0c;满足大众预约出行需要&am…...

CT剂量及描述方法详细介绍

CT剂量和普通放射剂量的区别 普通放射剂量分布区域大&#xff0c;但一般集中在皮肤入射表面&#xff0c;用患者入射表面剂量&#xff08;ESD)来表征射线剂量&#xff1b; CT剂量分布在窄带内&#xff0c;边缘与中心分布不均匀&#xff1b;且属于多层扫描&#xff1b; 1、在理想…...

Spring Boot应用优雅关闭

POM依赖 在需要实现优雅关闭的应用工程中增加下述依赖&#xff1a;部分启动器默认就依赖了Actuator启动器&#xff0c;如&#xff1a;spring-cloud-starter-netflix-eureka-server&#xff0c;那么下述依赖是可以省略的。 <dependency><groupId>org.springframewo…...

【实用技巧】7-Zip如何加密压缩文件?

7-Zip是一款免费且实用的压缩软件&#xff0c;除了提供多种压缩格式&#xff0c;还可以对压缩文件进行加密保护&#xff0c;加密后只有输入密码&#xff0c;才能打开压缩包里的文件。如果不知道怎么操作的小伙伴&#xff0c;就来看看小编的分享吧。 操作方法&#xff1a; 1、…...

Anaconda详细安装使用

如果想在conda里面删除某个环境&#xff0c;可以使用 conda remove -n name --all 来删除。 其中 conda info --envs 是查看环境&#xff0c;切换环境 activate base 。 Anaconda Anaconda | The Worlds Most Popular Data Science PlatformAnaconda is the birthplace of Pyt…...

git放弃修改,强制覆盖本地代码

在使用Git的过程中&#xff0c;有些时候我们只想要git服务器中的最新版本的项目&#xff0c;对于本地的项目中修改不做任何理会&#xff0c;就需要用到Git pull的强制覆盖&#xff0c;具体代码如下&#xff1a; $ git fetch --all $ git reset --hard origin/master $ git pu…...

大数据自我进阶(数据仓库)-暂未完全完成

什么时候需要数据仓库&#xff1f; 1.当决策者要进行战略分析或者展示统计的需求。 2.并且数据量非常庞大&#xff0c;而且各个都是数据孤岛。 当满足这2个条件后&#xff0c;就需要搭建数据仓库。 数据仓库的第一步&#xff08;数据清洗&#xff09; 为了能准确的分析&am…...

Springmvc中跨服务器文件上传

既然跨服务器&#xff0c;就要开启两个服务器&#xff0c;这里使用两个Tomcat代表两个服务器 文章目录 1.建立图片要上传到的服务器&#xff1a;FileUpload 2.建立上传图片的服务器&#xff1a;Tomcat 9.0.24 3.在Tomcat 9.0.24上部署文件上传的项目&#xff0c;写代码 3.1导入…...

常见漏洞扫描工具AWVS、AppScan、Nessus的使用

HVV笔记——常见漏洞扫描工具AWVS、AppScan、Nessus的使用1 AWVS1.1 安装部署1.2 激活1.3 登录1.4 扫描web应用程序1.4.1 需要账户密码登录的扫描1.4.2 利用录制登录序列脚本扫描1.4.3 利用定制cookie扫描1.5 扫描报告分析1.5.1 AWVS报告类型1.5.2 最常用的报告类型&#xff1a…...