Effective C++条款19:设计class犹如设计type(Treat class design as type design)

news/2024/4/26 7:45:12/文章来源:https://blog.csdn.net/CltCj/article/details/128112048

Effective C++条款19:设计class犹如设计type(Treat class design as type design)

  • 条款19:设计class犹如设计type
    • 5、牢记
  • 总结


《Effective C++》是一本轻薄短小的高密度的“专家经验积累”。本系列就是对Effective C++进行通读:


条款19:设计class犹如设计type

  C++就像在其他OOP(面向对象编程)语言一样,当你定义一个新class,也就定义了一个新type。身为C++程序员,你的许多时间主要用来扩张你的类型系统。这意味着你并不只是class设计者,还是type设计者。重载函数和操作符、控制内存的分配和归还、定义对象的初始化和终结…全部都在你手上。因此你应该带着和“语言设计者当初设计语言内置类型时”一样的谨慎来研讨class的设计。

  设计优秀的classes是一项艰巨的工作,因为设计好的types是一项艰巨的工作,好的types有自然的语法,直观的语义,以及一或多个高效实现品。在C++中,一个不良规划下的class定义恐怕无法达到上述任何一个目标。甚至class的成员函数的效率都有可能受到它们“如何被声明”的影响。

  那么如何设计高效的class呢?首先你必须了解你面对的问题。几乎每一个class都面对以下的问题:

  • 新type的对象应该如何被创建和销毁?这会影响到你的class的构造函数和析构函数以及内存分配函数和释放函数的设计。

  • 对象的初始化和对象的赋值有什么样的区别?这答案决定你的构造函数和赋值操作符的行为,以及其间的差异。很重要的是别混淆了“初始化”和“赋值”,因为它们对应不同的函数调用。

  • 新type的对象如果被passed by value(以值传递),意味着什么?记住,copy构造函数用来定义一个type的pass-by-value该如何实现。

  • 什么是新type的“合法值”?对于class的成员变量而言,通常只有某些数值集是有效的。那些数值决定了你的class必须维护的约束条件,也就决定了你的成员函数必须进行的错误检查工作,它也影响函数抛出的异常、以及函数异常明细列。

  • 你的新type需要配合某个继承体系吗?如果你继承自某些既有的classes,你就受到那些classes的设计的束缚,特别是受到“它们的函数是virtual或non-virtual”的影响。如果你允许其他classes继承你的class,那会影响你所声明的函数–尤其是析构函数——是否为virtual。

  • 你的新type需要什么样的转换?如果你允许类型T1之物被隐式转换为类型T2之物,就必须在class T1内写一个类型装换函数或者在class T2内写一个non-expliccit-noe-argument(可被单一实参调用)的构造函数。如果你允许explicit构造函数存在,就得写出专门负责执行转换的函数,且不得为类型转换操作符或non-explicit-one-argument构造函数。

  • 什么样的操作符合函数对此新type而言是合理的?这个取决于你将为你的class声明哪些函数。成员函数与否。

  • 什么样的标准函数应该驳回?那些正是你必须声明为private者。

  • 谁该采用新type的成员?这个跟设计成员函数有关。你可以决定哪个成员为private,哪个为protected,哪个为private。

  • 你的新类型的“未定义接口”是什么?对于性能,异常安全和资源的使用(比如锁和动态内存),你提供了什么样的保证?在这些领域中你所提供的保证将会对你的类实现强加限制。

  • 你的新type有多么一般化?或许你其实并非定义一个新type,而是定义一整个types家族。果真如此你就不应该定义一个新class,而是定义一个新的class template。

  • 你真的需要一个新的type吗?如果只是定义新的派生类以便为既有的class添加机能,那么说不定单纯定义一或多个非成员函数或模板,更能够达到目标

  这些问题不容易回答,所以定义出高效的classes是一种挑战。然而如果能够设计出至少像C++内置类型一样好的用户自定义classes,一切汗水便是值得的

5、牢记

  • class的设计就是type的设计。在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题。

总结

期待大家和我交流,留言或者私信,一起学习,一起进步!

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

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

相关文章

Faster RCNN全文翻译

Abstract—State-of-the-art【最先进的】 object detection networks depend on region proposal algorithms to hypothesize【假设、推测】 object locations.Advances like SPPnet [1] and Fast R-CNN [2] have reduced the running time of these detection networks, expos…

Redis集群方案备忘录

文章目录哨兵模式官方Redis ClusterJedis(客户端分片)Codis(代理分片)哨兵模式 优点 哨兵模式是基于主从模式的,解决可主从模式中master故障不可以自动切换故障的问题。缺点 (1)是一种中心化的…

一些跨平台技术方案的经验参考

今天就站在一个小开发的视角分享一下一个小项目是如何进行跨平台方案选型的 本系列文章先站在公司的的角度对产品技术选型进行分析,然后再根据我们项目实际开发经验进行汇总,供大家参考。 目前大前端技术也非常丰富,可以实现,一…

【uniapp】利用Vuex实现购物车功能

实战项目名称:实现购物车功能 文章目录一、实战步骤1. 先编辑store.js文件2. 定义方法和基本的结构3. 编写SETSHPPING二、在项目中调用1. 触发相应的mutations2. 利用computed计算数量和总价的方法提示:本实战内容大部分为具体实现的思路,界面…

FRED应用:激光二极管的模拟

简介 当提及模拟激光二极管时,FRED软件具有极大的灵活性。在这篇应用笔记中,将会描述简单到详细的激光光源模型。最基本的模型是高斯TEM0,0模。更高级的模型包括在束腰上偏移和发散中的像散光束。激光也可以使用其M2因子表示。最后,可以创…

猿如意开发工具|Sublime Text(4126)

文章目录 一、猿如意是什么? 二、如何使用猿如意下载安装Sublime Text 三、总结 一、猿如意是什么? 猿如意是一款面向开发者的辅助开发工具箱,包含了效率工具、开发工具下载,教程文档,代码片段搜索,全网搜…

Azure DevOps Server 用户组加入 Azure AD Domain Service 管理用户

一,引言 今天我们继续讲解 Azure DevOps Server 的内容,对于管理用户组除了在 Azure DevOps Server 服务器上添加管理员方式外,还有没有其他方式,Azure DevOps 需要加入Azure ADDS 服务域后,Azure DevOps Server 的管理…

oh-my-zsh 为 ls 命令自定义颜色

ls 命令默认显示的颜色是: 白色: 表示普通文件 蓝色: 表示目录 绿色: 表示可执行文件 红色: 表示压缩文件 蓝绿色: 链接文件 红色闪烁:表示链接的文件有问题 黄色: 表示设备文件 灰…

深入理解SR-IOV和IO虚拟化

一、背景 SR-IOV(Single Root I/O Virtualization)是由PCI-SIG组织定义的PCIe规范的扩展规范《Single Root I/O Virtualization and Sharing Specification》,目的是通过提供一种标准规范,为VM(虚拟机)提供…

ProcessDB实时/时序数据库——ODBC之连接数据库

目录 前言 一、安装ProcessDB-ODBC驱动 1.下载ProcessDB-ODBC驱动 2.安装ProcessDB-ODBC驱动 二、配置ProcessDB数据源 三、JAVA连接ProcessDB数据库 前言 ProcessDB实时/时序数据库支持ODBC连接数据库,接下来将和大家分享下如何使用ODBC操作ProcessDB实时/时…

基于Java Web的传智播客crm企业管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

tinymce富文本编辑器做评论区

今天分享一下tinymce富文本编辑器做评论区的全过程。 文章目录一、介绍1.最终效果2.功能介绍3.主要项目包版本介绍:二、每个功能的实现1.自定义toolbar的功能区①对应的样式以及意义②对应的代码实现【忽略了一切非实现该功能的代码】2.展示、收起评论区①对应的样式…

软件测试面试技巧:如何提高面试通过率?这3点一定要做到

对于想要进入到软件测试岗的新手人员来说,面试这一关是非常重要的,它直接关系着你的去留,也关系后续的期待遇问题,那么,有没有什么技巧可以帮忙提高面试通过率呢? 关于这一问题答案,我从这几个方…

Java自动化测试调试中遇到的问题

前言:记录下遇到的问题 Java自动化测试在调试中遇到的问题总结 1、遇到的Waring:must be unique [WARNING] dependencies.dependency.(groupId:artifactId:type:classifier) must be unique: com.vertica.jdbc:vertica-jdbc:jar -> duplicate declaration of version 10.…

数商云供应链管理系统助力化工行业企业实现客户订单管理可视化

订单管理是现代企业商务业务的重要组成部分,可以帮助企业解决订单管理低效、混乱等问题。随着产业互联网时代的到来,越来越多企业放弃传统费时费力的手动操作,开始应用数字化的管理工具来提高企业订单管理的水平。这里以化工行业企业为例&…

RabbitMQ 快速入门七种简单模式

RabbitMQ 快速入门七种简单模式起步七种模式项目依赖1、"Hello World!"(1) Connection 方式(2) RabbitTemplate 方式2、Work Queues生产者消费者3、Publish/Subscribe关系绑定生产者消费者4、Routing消费者生产者5. Topics消费者生产者6、RPC7、Publisher Confirms起…

09 更真实的云原生:Kubeadm实际搭建多节点的Kubernetes集群

文章目录1. 前言2. 什么是 kubeadm?2.1 kubeadm 介绍2.2 kubeadm 原理3. kubeadm 实验环境的架构是什么样的?3.1 Master 节点3.2 Worker 节点3.3 辅助节点3.4 安装前的准备工作3.4.1 修改主机名3.4.2 修改 Docker 配置3.4.3 修改网络设置3.4.4 修改交换分区4. 安装…

Android -- 每日一问:如何理解 Android 中的 Context,它有什么用?

经典回答 官方文档对于 Context 的解释: Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and cla…

Anaconda、Conda、pip、Virtualenv的区别

一、Anaconda 1.1 简介 Anaconda是一个包含180的科学包及其依赖项的发行版本。其包含的科学包包括:conda, numpy, scipy, ipython notebook等。 二、Conda 2.1 简述 conda是包及其依赖项和环境的管理工具。 适用语言:Python, R, Ruby, Lua, Scala, …

iOS 图标和文字自定按钮

在项目开发中,经常需要用到按钮,系统默认的按钮是图标在左边,标题在右边。但往往实际情况是多变的,有时候图标在右边、有时候图标在上面,这个时候系统的按钮往往无法满足需求,所以我们需要自定义按钮来满足…