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

条例24~25(设计与声明)

条例24

若所有参数皆需要类型转换,请为此采用非成员函数

  • 有时候让类型内成员函数支持隐式类型转换是不妥善的。比如当我们想在类内实现operator *() 模拟乘法的时候。通常情况下表现良好,但若你想额外实现混合式运算。例如 
    int ret = 2 * (成员对象);//错误int ret = (成员对象)*2;//正确

    就会出现问题,因为成员函数会通过this指针去调用。下面的写法通你自己实现的对象能找到你自己实现的*操作符重载,但是整数2找不到对应的*操作符操作。之所以第二种写法能通过编译是因为默认允许了隐式类型转换,在 operator * 遇到了 整数 2 的时候,会自动将整数2 调用构造函数生成一个临时常量,再将临时值传入operator * ()成功调用,若是禁止了隐式类型转换,则这两句都无法通过编译。

  1. 当只有参数位于参数列内,这个参数才能支持隐式类型转换。也就是说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内添加全新的东西
http://www.lryc.cn/news/188991.html

相关文章:

  • Spring5应用之事务处理
  • Python 中最常用的4种股票价格移动平均方法(三)
  • Mybaits缓存踩的坑
  • 全国工商注册数据库的作用
  • 【Linux】NTP时间服务器Chrony配置详解
  • 今年的秋招面试,确实有点难。
  • Rn使用FlatList导航栏自动回到中间
  • 单例模式中的线程安全问题
  • Android 13 骁龙相机点击拍照流程分析(一)——点击拍照到更新到左下角缩略图
  • Docker 的网络与数据管理
  • 在QGIS中给矢量数据属性编号的一种方法
  • 对一个变速器原理的分析
  • 秒验:可以自定义UI的一键登录服务
  • pmm最新版本v2.40.0尝鲜体验
  • 2023年中国数据存储市场现状及发展前景预测分析
  • xlsx冻结单元格
  • yolov8剪枝实践
  • 功能基础篇6——系统接口,操作系统与解释器系统
  • 由于导线材质不同绕组直流电阻不平衡率超标
  • 选择智慧公厕解决方案,开创智慧城市公共厕所新时代
  • FFmpeg 基础模块:AVIO、AVDictionary 与 AVOption
  • 代数——第3章——向量空间
  • 2023年软考网工上半年下午真题
  • Flutter 直接调用so动态库,或调用C/C++源文件内函数
  • elasticsearch(ES)分布式搜索引擎03——(RestClient查询文档,ES旅游案例实战)
  • 198、RabbitMQ 的核心概念 及 工作机制概述; Exchange 类型 及 该类型对应的路由规则
  • 系统架构设计:18 论基于DSSA的软件架构设计与应用
  • Android原生实现控件outline方案(API28及以上)
  • ROS学习笔记(六)---服务通信机制
  • 常见的C/C++开源QP问题求解器