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

Vue3+AI聊天室:如何实现消息自动滚动和流式响应?

Vue3AI聊天室&#xff1a;消息自动滚动与流式响应的工程实践 引言&#xff1a;当Vue3遇见AI对话 在构建现代化AI聊天应用时&#xff0c;流畅的交互体验往往比功能堆砌更重要。想象这样一个场景&#xff1a;用户发送问题后&#xff0c;界面立即开始逐字显示AI回复&#xff0c;同…...

新手避坑指南:用Prometheus+PX4+ROS在Gazebo里复现无人机追踪小车(保姆级流程)

新手避坑指南&#xff1a;用PrometheusPX4ROS在Gazebo里复现无人机追踪小车&#xff08;保姆级流程&#xff09; 当第一次接触无人机仿真开发时&#xff0c;很多人会被复杂的工具链和晦涩的错误信息劝退。本文将手把手带你完成从零搭建仿真环境到实现视觉追踪的全过程&#xff…...

OpenClaw硬件监控:nanobot定时报告系统资源使用情况

OpenClaw硬件监控&#xff1a;nanobot定时报告系统资源使用情况 1. 为什么需要自动化硬件监控 去年夏天&#xff0c;我的开发机因为内存泄漏问题突然宕机&#xff0c;导致一个重要的线上演示被迫推迟。当时我就意识到&#xff0c;手动检查系统资源的方式既不及时也不可靠。直…...

STM32F103C8T6 DHT11温湿度监测系统 HAL库 CubeMX实战(避坑指南)

1. 项目背景与硬件选型 温湿度监测是物联网领域最基础也最实用的功能之一。我最近用STM32F103C8T6和DHT11搭建了一个环境监测节点&#xff0c;整个过程踩了不少坑&#xff0c;也积累了一些实战经验。这个方案特别适合需要低成本、快速上手的场景&#xff0c;比如智能家居、农业…...

智能突破2048:AI助手如何让数字合成不再依赖运气

智能突破2048&#xff1a;AI助手如何让数字合成不再依赖运气 【免费下载链接】2048-ai AI for the 2048 game 项目地址: https://gitcode.com/gh_mirrors/20/2048-ai 你是否曾在2048游戏中陷入数字迷宫&#xff1f;眼看着屏幕上散落的方块无从下手&#xff0c;移动一步就…...

3步实战指南:轻松搭建抖音直播间弹幕数据抓取系统

3步实战指南&#xff1a;轻松搭建抖音直播间弹幕数据抓取系统 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取&#xff08;2024最新版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 想象一下&#xff0c;你…...

车辆信号震动信号的滤波、幅值与能量分析——基于测试台采集文件ssjlbpp.m等的研究

车辆信号的震动信号的滤波、幅值以及能量分析&#xff0c;信号是利用测试台采集回来的 文件列表&#xff1a; ssjlbpp.m cxssjlbpp.m ssj.m fuzhissj.m翻了翻硬盘里压箱底的车辆测试台数据&#xff0c;哦对&#xff0c;还有那堆当时随手起的.mat之外的.m文件&#xff1a;ssjlbp…...

PyTorch 2.8镜像多场景落地:在线教育平台个性化习题生成引擎部署

PyTorch 2.8镜像多场景落地&#xff1a;在线教育平台个性化习题生成引擎部署 1. 教育行业的AI转型机遇 在线教育行业正面临个性化学习的迫切需求。传统题库系统存在内容同质化、更新成本高、难以匹配学生个体差异等问题。基于PyTorch 2.8构建的个性化习题生成引擎&#xff0c…...

反步法Backstepping在非线性系统自适应控制中的数学艺术

1. 反步法Backstepping的数学艺术 第一次接触反步法时&#xff0c;我被它精妙的数学构造深深吸引。这就像玩俄罗斯套娃&#xff0c;通过层层递进的方式&#xff0c;逐步构建出整个控制系统的稳定性。反步法的核心思想&#xff0c;是通过设计虚拟控制量&#xff0c;将复杂的非线…...

ChatGPT官网镜像实战:生产环境内存泄漏排查与修复全记录

国内开发者如果想借助ChatGPT进行生产环境故障排查和性能分析&#xff0c;最便捷的方案是通过聚合镜像平台RskAi&#xff08;www.rsk.cn&#xff09;。该平台支持ChatGPT&#xff08;GPT-4o&#xff09;国内直接访问&#xff0c;无需任何特殊网络环境&#xff0c;且提供每日免费…...