《Effective C++》学习笔记 续

条款31:将文件间编译依存关系降至最低

请记住:

  • 支持”编译依存性最小化“的一般构想是:相依于声明式,不要相依于定义式。基于此构想的两个手段是Handle class和Interface class
  • 程序库头文件应该以”完全且仅有声明式“的形式存在。这种做法不论是否涉及template都适用

pimpl手法:在一个类中存放具体实现类的指针。这样,指针大小在32位系统上固定是4字节,无需知道具体实现类的大小。这解决了”接口与实现的分离“。是一种Handle class。

降低编译依存关系:

  • 如果使用object reference或object pointers可以完成任务,就不要使用objects
  • 如果能够,尽量以class声明替换class定义
  • 为声明式和定义式提供不同的头文件

抽象基类是interface class。

Handle class和Interface class可降低编译依存性。
 

条款32:确定你的 public 继承塑模出 is-a 关系

请记住:

  • public继承意味着is-a。适用于base class身上的每一件事一定也适用于derived class身上,因为每一个derived class对象也都是一个base class对象。

条款33:避免遮掩继承而来的名称

内层作用域的名称会遮掩外围作用域的名称

请记住:

  • derived class内的名称会遮掩base class内的名称(一般是一个类中同名函数多个重载的情况)。在public继承下从来没有人希望如此。
  • 为了让被遮掩的名称重见天日,可使用using声明式或转交函数(有一点理解,using)。

如果只想继承父类的部分函数,就可以使用private继承,然后设置一个转交函数,转交函数中使用父类作用域调用父类函数。

条款中,父类有多个重载函数的的情况,不论是虚函数还是非虚函数,都会发生遮掩。
 

 using 可以帮助我们获得base 中被遮掩的函数,但是如果我们只想要多个重载函数中的一个而不是全部的时候该怎么办呢?可以写一个简单的转交函数:

条款34:区分接口继承和实现继承

请记住:

  • 接口继承和实现继承不同。在 public 继承之下,derived classes 总是继承 base class 的接口
  • pure virtual 函数只具体指定接口继承
  • 简朴的(非纯)impure virtual 函数具体指定接口继承及缺省实现继承
  • non-virtual 函数具体指定接口继承以及强制性实现继承

条款35:考虑 virtual 函数以外的其他选择

  1. NVI手法:non-virtual interface

条款36:绝不重新定义继承而来的 non-virtual 函数

请记住:

  • 绝不重新定义继承而来的non-virtual函数
  1. 为什么?因为,重新定义non-virtual函数会打破is-a的关系。

条款37:绝不重新定义继承而来的缺省参数值

 对象的所谓静态类型(static type)就是它在程序中被声明时所采用的类型

virtual 函数是动态绑定的,但是缺省参数却是静态绑定的。意思是你可能会在“调用一个定义于 derived class”内的 virtual 函数的同时,却使用 base class 为它所指定的缺省参数值

请记住:

  • 绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而 virtual 函数--你唯一应该覆写的东西--却是动态绑定

条款38:通过复合塑模出 has-a 或“根据某物实现出”

参考文章:《Effective C++》笔记_effectivec++ 笔记-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/256173.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 用于开发H5项目展示饼图,使用ucharts 饼图示例

先下载ucharts H5示例源码: uCharts: 高性能跨平台图表库,支持H5、APP、小程序(微信小程序、支付宝小程序、钉钉小程序、百度小程序、头条小程序、QQ小程序、快手小程序、360小程序)、Vue、Taro等更多支持canvas的框架平台&#…

网络安全之Linux环境配置及Linux基础知识讲解<三>

目录 一.下载安装Vmware二.下载安装Kali三.Linux目录结构四.Linux文件属性五.文件目录管理六.vim编辑器 一.下载安装Vmware Vmware官网:https://www.vmware.com 二.下载安装Kali Kali包含数百种工具,可用于各种信息安全任务,例如渗透测试、…

(C++)将x减到0的最小操作数--滑动窗口

个人主页:Lei宝啊 愿所有美好如期而遇 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://le…

微机总线地址物理内存地址虚拟内存地址简介

硬件地址的相关概念 Raspberry Pi 发布适用于 ARM 外设的 BCM2835 数据表 地址映射 总线地址 物理地址 虚拟地址 页表和内存管理单元MMU 《 Linux内核设计与实现(第三版)》 树莓派博通BCM2835芯片手册 硬件地址的相关概念 总线地址 32位的操作系统 &…

【赠书活动】OpenCV4工业缺陷检测的六种方法

文章目录 前言机器视觉缺陷检测工业上常见缺陷检测方法延伸阅读推荐语 赠书活动 前言 随着工业制造的发展,对产品质量的要求越来越高。工业缺陷检测是确保产品质量的重要环节,而计算机视觉技术的应用能够有效提升工业缺陷检测的效率和精度。 OpenCV是一…

【机器学习】卷积神经网络(CNN)的特征数计算

文章目录 基本步骤示例图解过程 基本步骤 在卷积神经网络(CNN)中,计算最后的特征数通常涉及到以下步骤: 确定输入尺寸: 首先,你需要知道输入数据的尺寸。对于图像数据,这通常是 (batch_size, c…

1-完全理解以太坊智能合约

了解区块链 区块链技术的核心概念是分布式账本,它是许多参与者共享的特定类型的数据库。 这个特殊的数据库只是一个交易列表,记录着网络中发生的每笔交易。每个人都可以拥有自己的交易列表备份,再加上强有力的货币激励措施消除各方之间信任…

记录今日将C语言的Windows程序更改为python语言Windows程序,实现子窗口控制,类似微信程序框架最简单的原型

基本思路 为什么要选择python制作Windows应用程序,主要就是源代码直接展示,发现问题随时修改,同时可以不断增加新的功能方便。 由于C语言的Windows程序中结构类型在python中不能使用, 因此我们按照ctypes模块指导意见继承structu…

基于双目RGB图像和图像深度信息的三维室内场景建模matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双目视觉原理 4.2 深度信息获取 4.3 表面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

STM32与Freertos入门(三)任务的创建、删除

1、串口配置 首先将串口进行配置,后续经常会应用,具体步骤点击:串口配置。 2、任务 创建一个任务,就是开辟一个空间、每个任务中都会有while(1)死循环。 2.1相关函数 动态创建:xTaskCreate…

ros2/ros 4轮2驱机器人xacro/urdf文件示例代码

这个实验中最重要的是&#xff1a;colcon build 之后要记得source install/setup.bash.否则修改的文件是不会更新的。知道了吧 <robot name"half" xmlns:xacro"http://wiki.ros.org/wiki/xacro"><xacro:property name"PI" value"3…

SL3041高耐压100V降压恒压芯片 24V降压5V 24V降压12V 12V降5V

SL3041宽电压100V恒压芯片 24V降压5V 24V降压12V SL3041是一款宽电压100V恒压芯片&#xff0c;具有高效率、高精度、高可靠性等优点&#xff0c;广泛应用于各种电源系统中。在本文中&#xff0c;我们将详细介绍SL3041的工作原理、应用场景以及如何使用它实现24V降压5V和24V降压…

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…

GaussDB数据库表创建行访问控制策略

目录 一、前言 二、GaussDB中的行访问控制 1、CREATE ROW LEVEL SECURITY POLICY语法 2、ALTER ROW LEVEL SECURITY POLICY语法 3、ROW LEVEL SECURITY策略与适配SQL语法关系 三、GaussDB中的行访问控制策略示例 1、实现GaussDB行访问控制的一般步骤 2、行访问控制策略…

AWS解决方案架构师学习与备考

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

信息收集 - 网站服务器

操作系统 区分大小写: 如果修改首页或其他页面的大小写后,网站返回一个错误页面,例如报错 "404 Not Found" 或类似的错误,这可能意味着网站运行在 Linux 或类 Unix 操作系统上。这是因为大多数 Linux 系统是区分大小写的。如果修改大小写后,网站页面正常显示,这…

maui中实现加载更多 RefreshView跟ListView(2)

一个类似商品例表的下拉效果&#xff1a; 代码 新增个类为商品商体类 public class ProductItem{public string ImageSource { get; set; }public string ProductName { get; set; }public string Price { get; set; }}界面代码&#xff1a; <?xml version"1.0&quo…

人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码 可实时检测

人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 目录 人体关键点检测4&#xff1a;C/C实现人体关键点检测(人体姿势估计)含源码 可实时检测 1.项目介绍 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&…

Vue--第十天

终极实战----大事件项目 1.简介&#xff1a; 2.创建项目&#xff1a; 1.创建&#xff08;159-163&#xff09;&#xff1a; 还是对着视频操作吧 2.路由&#xff1a; 3.element Plus: 导入element Plus 后不需要再导入插件配置&#xff0c;就连组件导入也不用 4.pinia构建用…

【C盘清理】Jetbrains全家桶(PyCharm、Clion……)更改 IDE 特定文件(配置、缓存、插件、日志等)存储位置

文章目录 一、官网说明二、更改 IDE 目录的位置1. 转到“帮助”|“编辑自定义属性”2. 各文件位置3. 以PyCharm系统目录为例4. 修改idea.properties 三、清理旧的 IDE 目录 一、官网说明 IDE 使用的目录官网说明 二、更改 IDE 目录的位置 默认情况下&#xff0c;PyCharm 将每…