《Effective C++》知识点(4)--设计与声明

18. 让接口容易被正确使用,不易被误用

      18.1 好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。任何接口如果要求客户必须记得做某些事情,就有着"不正确使用"的倾向。

      18.2 "促进正确使用"的办法包括接口的一致性,以及与内置类型的行为兼容(尽量令你的types的行为与内置types一致)。

      18.3 "阻止误用"的办法包括建立新类型、限制类型上的操作(什么事可做,什么事不能做)、限制对象值、以及消除客户的资源管理责任。

      18.4 std::tr1::shared_ptr支持定制型删除器,这可防范DLL问题,可被用来自动解除互斥锁等等。 对象在一个DLL中被new,却在另一个DLL被delete,会导致运行期错误。使用shared_ptr的成本是,Boost的shared_ptr是原始指针的两倍大。

19. 设计class犹如设计type

      class的设计就是type的设计。在定义一个新的type之前,请仔细考虑一下问题:

   a. 新type的对象应该如何被创建和销毁?

   b. 对象的初始化和对象的赋值该有什么样的差别?

   c. 新type的对象如果被passed by value(值传递),意味着什么?

   d. 什么是新type的合法值? 

   e. 新type需要配合某个继承图系吗?(考虑继承与被继承)

    f. 新type需要什么样的转换?

   g. 什么样的操作符和函数对此新type而言是合理的?

   h. 什么样的标准函数应该驳回?(声明为private)

    i. 谁该取用新type的成员?

    j. 什么是新type的"未声明接口"?(如何保证效率,异常安全性,资源运用)

   k. 新type有多么一般化?如果是定义types家族,应该定义一个新的类模板。 

    l. 你真的需要一个新type吗?非成员函数或模板能否解决问题?

20. 宁以pass-by-reference-to-const替换pass-by-value

      20.1 尽量以pass-by-reference-to-const替换pass-by-value。前者比较高效(少了对参数对象的构造和析构),并可避免切割问题(父类作传值参数时,子类的信息被切除)。

      20.2 这个规则不适用于内置类型,以及STL的迭代器和函数对象。对它们而言, pass-by-value往往比较适当。

21. 必须返回对象时,别妄想返回其引用

      21.1 当你必须在"返回一个引用"和"返回一个对象"之间选择时,你的工作就是挑出行为正确的那个,剩下的交给编译器。

      21.2 绝对不要返回指向一个local stack(局部栈内)对象的指针或引用,因为离开作用域后这个对象就不存在了。不要返回指向一个堆分配对象的引用,何时delete是个问题。不要返回指向一个local static对象的指针或引用, 可能面临需要多个这样的静态对象的问题。

22. 将成员变量声明为private

      22.1 切记将成员变量声明为private。因为将变量隐藏在函数接口背后

             a. 赋予客户访问数据的一致性(都通过成员函数)。

             b. 可细微划分访问控制(只读、只写、可读写、不可访问)。

             c. 提供充分的实现弹性。例如保证约束条件,通知其它对象,多线程同步等等。

             d. 保留了日后变更实现的权力。

      22.2 只有两种访问权限:private(封装)和其它(不封装)。protected并不比public更具封装性。 

23. 宁以non-member non-friend替换成员函数

      a. 增加封装性,不会增加"能够访问私有成员"的函数数量。

      b. 包裹弹性(packaging flexibility),降低编译依赖度。

      c. 机能扩充性,将所有便利(工具)函数放在多个头文件内但隶属于同一个命名空间,让客户可

          以轻松扩展这一组便利函数(添加non-member non-friend函数)。 

24. 若所有参数皆需类型转换,请采用non-member函数

      如果函数每个实参都需要转换,特别是隐式转换,应该声明为非成员函数。

      不能够只因函数不该成为member,就让它称为friend。

25. 考虑写出一个不抛出异常的swap函数

      25.1 当std::swap对你的类型效率不高时,提供一个public的swap成员函数,并确保这个函数不抛出异常。因为高效率的swap总是基于对内置类型的操作,内置类型操作不会抛出异常。

      25.2 如果你提供一个成员函数swap,那也应该提供一个非成员函数swap来调用前者。对于classes(而非templates),也请特化std::swap。template<>表示全特化。template<typename T>表示部分特化。

      25.3 调用swap时应针对std::swap使用using声明式,然后调用swap并且不带任何"命名空间资格修饰"。让编译器决定调用合适的swap函数。

      25.4 为"用户定义类型"进行std template全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。因为会导致不可预期行为,std的内容完全由c++标准委员会决定。

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题

四、用go语言&#xff0c;对于一个含 n个结点的任意有根树&#xff0c;写出一个 O(n)时间的过程&#xff0c;输出其所有关键字该树以左孩子右兄弟表示法存储。 文心一言&#xff1a; 在计算机科学中&#xff0c;左孩子右兄弟表示法是一种用于表示树状结构的方法&#xff0c;其…

解决Maven打包Nacos时插件报错

Maven打包指令&#xff1a;mvn clean install -Dmaven.test.skiptrue -Dcheckstyle.skiptrue 在执行时报错&#xff0c;报错信息如下&#xff1a; Failed to execute goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1:compile (default) on project nacos-consist…

gradle多模块依赖管理最佳实践

gradle多模块依赖管理最佳实践 多模块项目依赖管理定义子模块使用buildSrc定义插件SofastModulePluginOptional 依赖 增加dependencies子模块其他子模块web 多模块项目依赖管理 依赖管理是项目开发过程中必不可少的操作&#xff0c;在gradle如何优雅的管理多个模块依赖是一个非…

软考下午第一题 案列分析

期待分值 10&#xff0c;前三问12左右分&#xff0c;最后一题2、3分左右&#xff0c;重点在于拿下前面三题。 小心谨慎&#xff0c;不要大意。 数据流图 外部系统 数据存储 加工&#xff08;&#xff09;process 数据流 第二小题 说明给出存储名称&#xff0c;就使用该名称&…

k8s 1.28版本:使用StorageClass动态创建PV,SelfLink 问题修复

k8s中提供了一套自动创建 PV 的机制&#xff0c;就是基于 StorageClass 进行的&#xff0c;通过 StorageClass 可以实现仅仅配置 PVC&#xff0c;然后交由 StorageClass 根据 PVC 的需求动态创建 PV。 问题&#xff1a;   使用 k8s 1.28版本&#xff0c;通过 kubectl get pv…

走进国产机器人领军品牌华数机器人,共探数字化变革魔力

近日&#xff0c;纷享销客举办的“一院两司服务对接会暨走进纷享销客【数字化标杆】游学示范基地活动”在佛山顺利举行&#xff0c;本期活动走进华中数控旗下品牌、国家级专精特新“小巨人”企业华数机器人&#xff0c;特邀佛山华数机器人有限公司常务副总经理杨林、纷享销客广…

【vue3】样式穿透、完整新特性、动态css、css-module

一、样式穿透 vue2里面使用 /deep/ vue3里面使用 :deep() :deep(.el-input__inner){background-color: red; }二、完整新特性 :slotted() //parent.vue <template><div><p>这是父级</p><span></span><A><p class"red"…

高级深入--day44

Scrapy 和 scrapy-redis的区别 Scrapy 是一个通用的爬虫框架&#xff0c;但是不支持分布式&#xff0c;Scrapy-redis是为了更方便地实现Scrapy分布式爬取&#xff0c;而提供了一些以redis为基础的组件(仅有组件)。 pip install scrapy-redis Scrapy-redis提供了下面四种组件&a…

Unable to find GatewayFilterFactory with name TokenRelay

目录 问题分析解决方案参考文档开源项目微服务商城项目前后端分离项目 问题分析 Spring Cloud Gateway 网关作为代理资源服务器&#xff0c;需要将 JWT 传递给下游资源服务器&#xff0c;下面是网关的配置 spring:cloud:gateway:discovery:locator:enabled: true # 启用服务发…

Linux 块设备驱动实验

前面我们都是在学习字符设备驱动&#xff0c;本章我们来学习一下块设备驱动框架&#xff0c;块设备驱动是 Linux 三大驱动类型之一。块设备驱动要远比字符设备驱动复杂得多&#xff0c;不同类型的存储设备又 对应不同的驱动子系统&#xff0c;本章我们重点学习一下块设备相关驱…

.NET、VUE利用RSA加密完成登录并且发放JWT令牌设置权限访问

后端生成公钥私钥 使用RSA.ToXmlString(Boolean) 方法生成公钥以及私钥。 RSACryptoServiceProvider rSA new(); string pubKey rSA.ToXmlString(false);//公钥 string priKey rSA.ToXmlString(true);//私钥 后端将生成的公钥发送给前端 创建一个get请求&#xff0c;将…

光流估计(二) FlowNet 系列文章解读

在上篇文章中&#xff0c;我们学习并解了光流&#xff08;Optical Flow&#xff09;的一些基本概念和基本操作&#xff0c;但是传统的光流估计方法计算比较复杂、成本较高。近些年来随着CNN卷积神经网络的不断发展和成熟&#xff0c;其在各种计算机视觉任务中取得了巨大成功&am…

【剑指offer|图解|双指针】移除元素 + 合并两个有序数组

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板、汇编语言 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️移除元素二. ⛳️合并两个有序数组&#x1f4dd;全文总结 &#…

vue3后台管理系统

项目创建及代码规范化开发 vue脚手架创建项目 安装vue脚手架 npm install-g vue/cli npm update -g vue/cli终端输入vue create 项目名称 即可进入模板选择 //利用vue-cli创建项目 进入模板选择 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)De…

2011-2021年“第四期”数字普惠金融与上市公司匹配(根据城市匹配)/上市公司数字普惠金融指数匹配数据

2011-2021年“第四期”数字普惠金融与上市公司匹配&#xff08;根据城市匹配&#xff09;/上市公司数字普惠金融指数匹配数据 1、时间&#xff1a;2011-2021年 指标&#xff1a;指标&#xff1a;股票代码、年份、行政区划代码、行业名称、行业代码、所属省份、所属城市、数字…

省市区三级联动查询redis(通过python脚本导入数据)

最近工作有一个工作需求是实现省市区联动&#xff0c;点击省下拉框&#xff0c;选中一个省&#xff0c;然后再选市&#xff0c;最后选区&#xff0c;当然最重要的首先自然是数据了&#xff0c;没数据怎么测试接口&#xff0c;我数据是在 https://hxkj.vip/demo/echartsMap/ 这里…

No172.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

记一次任意文件下载到Getshell

任意文件下载&#xff08;Arbitrary File Download&#xff09;是一种常见的 Web 攻击技术&#xff0c;用于窃取服务器上任意文件的内容。攻击者利用应用程序中的漏洞&#xff0c;通过构造恶意请求&#xff0c;使应用程序将任意文件&#xff08;如配置文件、敏感数据等&#xf…

Typora(morkdown编辑器)的安装包和安装教程

Typora&#xff08;morkdown编辑器&#xff09;的安装包和安装教程 下载安装1、覆盖文件2、输入序列号①打开 typora &#xff0c;点击“输入序列号”&#xff1a;②邮箱一栏中任意填写&#xff08;但须保证邮箱地址格式正确&#xff09;&#xff0c;输入序列号&#xff0c;点击…

安防监控项目---boa服务器的移植

文章目录 前言一、boa服务器简介二、移植步骤三、测试结果四、A9平台移植BOA总结 前言 书接上期&#xff0c;在配置完成环境后&#xff0c;那么接下来呢还得移植两个非常关键的东西&#xff0c;一个呢时boa服务器&#xff0c;另一个呢时cgi接口&#xff0c;boa服务器能够使得我…