条例24~25(设计与声明)
条例24
若所有参数皆需要类型转换,请为此采用非成员函数
- 有时候让类型内成员函数支持隐式类型转换是不妥善的。比如当我们想在类内实现operator *() 模拟乘法的时候。通常情况下表现良好,但若你想额外实现混合式运算。例如
int ret = 2 * (成员对象);//错误int ret = (成员对象)*2;//正确就会出现问题,因为成员函数会通过this指针去调用。下面的写法通你自己实现的对象能找到你自己实现的*操作符重载,但是整数2找不到对应的*操作符操作。之所以第二种写法能通过编译是因为默认允许了隐式类型转换,在 operator * 遇到了 整数 2 的时候,会自动将整数2 调用构造函数生成一个临时常量,再将临时值传入operator * ()成功调用,若是禁止了隐式类型转换,则这两句都无法通过编译。
-
当只有参数位于参数列内,这个参数才能支持隐式类型转换。也就是说this指针本身是不参与隐式类型转换的。只要我们让他成为非成员函数,没有this指针,每个参数都可以进行隐式类型转换了。
总结
- 如果需要为某个函数的所有参数,包括被this指针所指向的隐含参数,进行类型转换,则需要把它实现成非成员函数。
条例25
考虑写出一个不抛异常的swap函数
- stl中已经实现了swap函数,默认使用的是浅拷贝。(用三个对象互相复制实现)但其实对某些类型而言。这些复制是没有必要的。当使用pimpl手法时(以指针指向一个对象,内含真正数据),只需要交换指向资源的指针就可以了,但缺省的swap算法不知道这一点,将对象也复制了,极大的降低了效率。
- 我们可以试着将stl容器内的swap针对当前类型进行特化。然后手动实现交换的操作。同时为了不破坏封装性。我们应该在当前类内提供交换的具体交换,同时在类外针对stl的swap特化时调用他。不仅没破坏封装并和stl的swap实现了一致性。
- 但是当我们遇到交换对象是类型模板而非类型时这种做法无法解决问题。因为c++不允许偏特化函数模板。我们仍然在类内提供swap函数的具体实现,但这次我们在类外调用的时候不采取特化或重载标准库的stl的方式,而是用命名空间的方式将其封装起来。当你在使用的时候打开std和当前的命名空间,这样编译器会试着调用你自己实现的swap,若调用不了则调用stl的。
- 如果stl的swap的效率可以接受则不需要额外操作,若缺省版本的效率低下,则可以通过提供public成员函数实现swap,并在命名空间内提供一个非成员函数并让他调用类内的成员函数。如果正在编写的是类而非模板类,应该试着特化std的swap。
- 成员版的swap不应该抛出异常,为了帮助类实现强异常安全性
总结
- 当stl的swap效率不高时,提供一个swap成员函数并保证其不抛出异常
- 用类外成员函数调用类内成员的swap,若实现的是类,则特化标准库的swap
- 在调用的时候针对swap使用using声明
- 不能在stl内添加全新的东西
相关文章:
条例24~25(设计与声明)
条例24 若所有参数皆需要类型转换,请为此采用非成员函数 有时候让类型内成员函数支持隐式类型转换是不妥善的。比如当我们想在类内实现operator *() 模拟乘法的时候。通常情况下表现良好,但若你想额外实现混合式运算。例如 int…...
Spring5应用之事务处理
作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…...
Python 中最常用的4种股票价格移动平均方法(三)
一、简介 移动平均线是各级交易者和投资者最广泛使用的技术指标之一。它们通过计算特定时期内的平均价格来帮助消除股票价格的固有波动性。移动平均线计算起来很简单,但也有更复杂的形式,旨在捕捉市场的更多细微差别。 这个由四部分组成的系列将讨论总共 4 种不同的移动平均方…...
Mybaits缓存踩的坑
记Mybaits缓存踩的坑 1.问题提出 最近开发一个记录操作前后修改内容的功能,获取修改前数据比较简单,直接从数据库获取,记录修改后的功能也比较简单,直接将用户修改的内容封装成po对象,然后两个比对就可以了ÿ…...
全国工商注册数据库的作用
随着经济的发展和市场竞争的加剧,越来越多的人开始关注公司的工商信息。这些信息不仅可以帮助人们了解公司的基本情况,还可以为投资者、合作伙伴、员工等提供决策依据。 工商数据库提供了全国范围内企业的基本信息。这些信息包括企业的名称、统一社会信用…...
【Linux】NTP时间服务器Chrony配置详解
🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁 🦄 个人主页——🎐开着拖拉机回家_大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助🌸文…...
今年的秋招面试,确实有点难。
不可否认的是,今年秋招确实有点难 从今年的形势来看,好的 offer 都掌握在少数人的手里,想要秋招找到理想的工作,要么学历好,要么技术功底很扎实,这两样都不占的话,就业压力就会比较大。 如何从…...
Rn使用FlatList导航栏自动回到中间
import { useState, useRef } from react import { FlatList, View, Text, StyleSheet, TouchableOpacity } from react-nativeconst Center () > {const tabs ["语文", "数学", "英语", "政治", "历史", "地理&q…...
单例模式中的线程安全问题
小王学习录 本日鸡汤:单例模式什么是单例模式如何实现单例模式饿汉模式懒汉模式单例模式下的线程安全问题为什么在单例模式下会出现线程安全问题如何解决单例模式中的线程安全问题本日鸡汤: 志在山顶的人, 不会贪恋山腰的风景 单例模式 单例模式是设计模式中的一种, 所谓设计…...
Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图
一.背景 由于最近客户定制需要将文件挂载类型修改为sdcardfs,由于修改了文件挂载类型,导致了骁龙相机拍照后不能点击进入相册,故对骁龙相机从点击事件开始进行问题的排查,此处不介绍最终的sdcardfs挂载后的问题解决方案 二.流程介绍 拍照的流程大概分为几个阶段:打开相机…...
Docker 的网络与数据管理
Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机…...
在QGIS中给矢量数据属性编号的一种方法
目录 写在文章前 一、给要素编号用哪些功能 二、实现一个最简单的编号 1.数据准备 2.编辑字段计算器表达式 3.查看编号结果 三、更加复杂的编号 1.使用UUID编号 2.根据单个属性排序后编号 3.根据多个属性排序后编号 4.拼接字符串进行编号 5.根据时间编号及实现 写在…...
对一个变速器原理的分析
背景 原本是朋友在调试一个看起来比较新的变速器驱动,整体来说支持两种变速模式,一种是进程级,这种用了HOOK,中规中矩的实现,原理网上都有。另一种是”系统级内核全局变速“,这个模式初步看了下有些特殊&a…...
秒验:可以自定义UI的一键登录服务
一键登录如今成为越来越多移动应用的首选,但千篇一律的登陆界面在引发用户担忧其安全性的同时,也容易让用户在不同APP切换时产生误解。因此,由国内知名移动应用开发服务商MobTech打造的一键登录工具——秒验,通过允许开发者自定义…...
pmm最新版本v2.40.0尝鲜体验
1 概述 PMM 是一款免费开源的企业级的数据库监控工具,可用来监控 MySQL、MongoDB 和 PostgreSQL 等数据库。除了指标监控,针对MySQL还具备SQL语句的性能监控。 官方地址是https://docs.percona.com/percona-monitoring-and-management,最新版…...
2023年中国数据存储市场现状及发展前景预测分析
中商情报网讯:当前,新一代信息技术快速发展推动信息产业发生了重大变革,数据存储行业将很快成为信息领域一个重要的产业分支。生成式人工智能催生算力需求,各种新兴应用场景对数据存储的容量、效率、流动性和安全性等方面提出了更…...
xlsx冻结单元格
说明 因为最近需要实现前端导出 excel 文件,并且对导出文件的样式进行一些修改,比如颜色、字体、合并单元格等,所以我找到了xlsx-style这个项目,它可以对导出的 excel 文件进行一些样式上的修改,这个项目是SheetJs的一…...
yolov8剪枝实践
本文使用的剪枝库是torch-pruning ,实验了该库的三个剪枝算法GroupNormPruner、BNScalePruner和GrowingRegPruner。 安装使用 安装依赖库 pip install torch-pruning 把 https://github.com/VainF/Torch-Pruning/blob/master/examples/yolov8/yolov8_pruning.py&…...
功能基础篇6——系统接口,操作系统与解释器系统
系统 os Python标准库,os模块提供Python与多种操作系统交互的接口 import os import stat# 文件夹 print(os.mkdir(r./dir)) # None 新建单级空文件夹 print(os.rmdir(r./dir)) # None 删除单级空文件夹 print(os.makedirs(r.\dir\dir\dir)) # None 递归创建空…...
由于导线材质不同绕组直流电阻不平衡率超标
实测证明, 有的变压器绕组的直流电阻偏大, 有的偏差较大, 其主要原因是某些导线的铜和银的含量低于国家标准规定限额。 有时即使采用合格的导线, 但由于导线截面尺寸偏差不同, 也可以导致绕组直流电阻不平衡率超标。 …...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
