《Effective C++第三版》读书笔记——设计与声明

《Effective C++》 读书笔记(详细总结55条款)上篇 下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性 阅读详情

4 设计与声明
~~~~~~~~~~~~~

4.1 让接口容易被正确使用,不易被误用
====================================
   1. 许多客户端错误可以因为导入新类型而获得预防.
      一旦使用了新类型,限制其值就顺其自然了.
   2. 任何接口如果要求客户必须记得做某事,就是有着不正确使用的倾向,因为客户可能会忘记做那件事.

4.2 设计class犹如设计type
==========================
   1. 几乎没有class都要求你面对以下几个问题
      * 新的type的对象应该如何被创建和销毁?
      * 对象的初始化和对象的赋值应该有什么样的差别?
      * 新的type的对象如何被passed by value?
        copy构造函数用来定义一个type的pass-by-value该如何实现
      * 新type的合法值范围是什么?
      * 你的新type是否继承至其他类,或者有其他类继承至新type类?
        特别关系到函数的virtual和non-virtual的影响
      * 你的新type需要转换为其他type吗?
        如果你希望类型T1可以隐性转换为类型T2,可以
        1) 在class T1内写一个类型转换函数(operator T2)
        2) 在class T2内写一个non-explicit-on-argument的构造函数
      * 什么样的操作符和函数对该type而言是合理的
      * 什么样的标准函数应该被屏蔽(声明为private)
      * 哪些类型可以存取type内成员?
        这个问题帮助你决定成员的权限,也帮助你决定哪一个class或function是友元的,以及它们嵌套于另一个之内是否合理.
      * 什么是新type的未声明接口( *什么意思??* )
      * 你想定义的是一个新type还是整个types家族,或许你应该定义的是一个新的class template
      * 你真的需要一个新的type吗?
        如果只是定义新的derived class以便为既有的class添加功能,那么说不定单纯定义一个函数就能达到目标

4.3 以pass-by-reference-to-const替换pass-by-value
==================================================
   1. 节省开销
   2. 解决子类的切割问题
   3. 对于内置类型STL的迭代器和函数对象,pass-by-value比pass-by-reference-to-const效率高

4.4 宁以non-member-non-friend函数替换member函数
================================================
   1. 由于member函数可以访问类中private数据,而non-member-non-friend函数不能访问类的private函数,因此non-member-non-friend函数的封装性强过member函数
   2. friend函数的封装性与member函数相同,他们都能访问类的private数据
   3. 在C++,比较自然的做法是让non-member-non-friend函数与类放在同一个命名空间中,这也是C++标准程序库的组织方式.

4.5 若所有参数都需要类型转换,请为此采用non-member函数
======================================================
   1. 只有当参数被列于参数列内,这个参数才是隐式类型转换的合格参与者.而member函数所在对象(this对象)也因此并不能被隐式转换.
      因此,为了使用对象的隐式转换功能,可以把this作为non-member函数中的一个参数.

4.6 当std::swap的效率不够高时,考虑写出一个不抛异常的swap函数
=============================================================
   1. 可以在member的swap函数中调用std::swap对private权限的成员进行互换
   2. 只能对class templates进行偏特化,而function templates不能进行偏特化,只能进行全特化.
   3. 如果你打算偏特化一个function template时,惯常做法是简单的为它添加一个重载版本
   4. 严格来说,std是个特殊的命名空间,客户可以全特化std内的templates,但不能添加新的templates或classes或functions或任何东西到std里头.
      std的内容理论上完全由C++标准委员会决定.
   5. 如果swap的缺省实现提供的效率可接受的话,就不用做任何事了.
      如果swap缺省实现效率不足,那么试着做以下事情
      1) 提供一个public swap成员函数,让它高效地置换你的类型的两个对象值.这个函数不能抛出异常
      2) 让你的class货template所在的命名空间内提供一个non-member swap,并令它调用上述的swap成员函数
      3) 如果你编写一个class,为你的class特化std::swap.并令它调用你的swap成员函数.
 

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1144749

读书笔记:《Effective Modern C++(C++14)》 使用RAII(“Resource Acquisition Is Initialization,资源获得即初始化)包装thread,在析构时进行join。和闭包类存在于编译期,闭包存在于运行时。 阅读详情

相关推荐

《Effective C++》读书笔记——第一章:Accustoming Yourself to C++

大年三十却不能回家,也不能找????玩,我恨死这个新型冠状病毒了 既然只能宅在家,那就充分利用一下这段时间多学习一点吧 言归正传,本章主要是在讲如何让自己适应C++,当然这也是全书所想要表达的,只是这一章着重讲一些基础 Item 1: VIEW C++ AS A FEDERATION OF LANGUAGES 特意去查了一下federation是什么意思,好像大概是说联盟、联邦之类的,所以这条item...

Luminous 1558

条款24(二):若所有参数皆需类型转换,请为此采用non-member函数

位于参数列的参数才会被隐式转换

不积跬步无以至千里 960

WPF窗口定位技巧:从基础到高级的三种实现方法

本文详细解析WPF窗口定位的三种核心方法:屏幕居中(CenterScreen)、父窗口居中(CenterOwner)和手动定位(Manual)。通过对比其适用场景、实现代码与注意事项,帮助开发者根据实际需求选择最佳方案,从而提升WPF应用程序的用户体验与专业度。

weixin_29224309的博客 272

Effective C++学习笔记(六) 设计与声明(二)

Effective C++学习笔记(六) 设计与声明(二) 条款 23 宁以non-number、non-friend替换member函数 使用non-number 与 non-friend 函数,没有增加封装类的可访问性,friend函数和member函数对class private成员的访问权限相同,因此二者对封装的冲击力道相同。 namespace 和class不同,前者可跨越多个源码文件而后者不能。 这里要视情况而定,看是要增加一个什么样的函数,不能只增加非成员函数,而忘记了封装的本性。 条款 24

weixin_46708094的博客 230

iStore增强插件 如何重塑家庭网络与存储体验

本文深入解析了iStore增强插件如何重塑家庭数字生活体验。它通过集成智能流控、一键式文件共享、媒体服务器及智能家居网关等功能,将复杂的网络配置、存储管理与设备协同简化为图形化操作,有效解决了家庭网络卡顿、数据割裂与使用门槛高等核心痛点,让普通用户也能轻松打造高效、稳定、安全的家庭数字中枢。

prometheus9mon的博客 648

SNN目标识别MNIST

总体来说这篇论文提出的方法用了多种更精密的细节,如LIF膜电位公式,三种STDP方法,但我觉得还可以有很大的改进,比如输入层全连接到兴奋层,兴奋层通过抑制层实现的侧向抑制,抑制层不参与学习等等。尤其是兴奋层通过抑制层实现侧向抑制这里,当神经元兴奋时,通过抑制层再倒回兴奋层,所抑制的已经经过一了一段时间的延迟。如有错误,请不吝赐教。

m0_74982304的博客 1262

EffectiveC++条款25的理解

Effective C++条款25的理解 这个条款的全称是考虑写出一个不抛出异常的swap函数,通过研究swap函数的各种改善方法来教你设计一个高效的函数。在阅读过程中,对于全特化和偏特化,类和类模板和函数模板这几者之间的关系不太理解,这里写下自己的一些思考。 一、为什么要进行特化? 进行特化的原因是为了更高的效率,对于特定的类型,如果你有更好的实现方案,那么编译器就会调用特化版本而不是...

夏言谦的博客 904

rv1126 SDK编译【2020-0912版本SDK包】

rv1126 sdk 编译

学习记录 1万+

Effective C++读书笔记

 记得前段时间又一次拿起《Effective C++》的时候,有种豁然开朗的感觉,所以翻出了我第一遍读时做的笔记。只做参考以及查阅之用。如有需要请参阅《Effective C++》书本。 by shenzi/2010.5.17一.让自己习惯C++   条款01:视C++为一个语言联邦    为了更好的理解C++,我们将C++分解为四个主要次语言:C。说到底C++仍是以C

shenzi的天空 2万+

PCF8591实战指南:从IIC通信到STM32的ADC/DAC配置(附完整代码)

本文详细介绍了PCF8591芯片在STM32开发中的实战应用,涵盖IIC通信协议、ADC/DAC配置及完整代码实现。通过解析DATA SHEET关键参数,提供硬件连接指南、控制字节配置技巧和常见问题解决方案,帮助开发者快速掌握这款8位模数/数模转换器的使用,实现精确的模拟信号处理。

y7z8a的博客 540

IPD(集成产品开发)管理之道

IPD,是集成产品开发(Integrated Product Development)的缩写,它是集成了众多管理模型和理论、众多企业最佳管理实践的一整套体系,可以帮助企业快速响应市场变化、缩短产品上市时间、减少资源浪费、提高生产力,最终取得商业成功。IPD的思想最早来源于美国PRTM公司出版的《产品及生命周期优化法》一书中,该书详细描述了IPD模式所包含的各个方面。但IPD在中国的普及,源于IBM和华为的推行使用。IPD作为一套先进的产品研发管理模式,其成功的基础是功能部门和各团队之间的密切配合。

钢镚·真的博客 2715

Effective C++读书笔记(上)

Effective C++读书笔记(一到三章)

still_wtm的博客 748

U盘插入电脑时发出声音但不显示——编程解决方案

以上是一些常见的编程解决方案,帮助您解决U盘插入电脑时发出声音但不显示的问题。请注意,这些解决方案可能因不同的情况而略有不同,因此请根据您的具体情况进行调整和尝试。当您将U盘插入电脑时,如果您听到了连接声音,但是U盘却没有在文件资源管理器或桌面上显示出来,这可能是由于一些常见问题导致的。U盘的文件系统格式可能与您的计算机不兼容,导致无法正确识别。如果输出显示U盘的文件系统格式与您的计算机不兼容,您可以尝试重新格式化U盘或使用其他兼容的文件系统格式。其中,X是U盘的磁盘编号,Y是您想要分配给U盘的盘符。

ByteEchoX的博客 2463

读书笔记_Effective C++_习惯C++

这是一本非常经典C++书籍,也是我在工作中发现自己C++上还有很多薄弱点的时候经常拿来充电的。这本书内容很多,讲了很多如何高效地使用C++的方法,有些地方自己也没能啃透,读过一遍后很多知识点容易忘记,这次是一条一条地进行温习,之所以会分享出来是觉得对于程序员来说,好记性不如烂笔头,自己多动手往往在真正写程序的时候能够像条件反射一样写出好的代码。慢工出细活,对待技术要有谨慎和敬畏之心。这本书推荐喜欢C

John_cdy的专栏 3194

反应动力学仿真软件:Kintecus_(11).数据输入与输出解析

在反应动力学仿真软件的二次开发中,数据输入与输出解析是至关重要的步骤。正确地解析输入数据和生成输出结果不仅能够确保仿真过程的顺利进行,还可以提高仿真的准确性和效率。本节将详细介绍如何在仿真软件中实现数据输入与输出的解析,包括文件格式、数据结构、解析方法以及实际操作示例。

kkchenjj的博客 757

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【effective c++读书笔记】【第4章】设计与声明(1)

条款18:让接口容易被正确使用,不容易被误用 1、许多客户端错误可以因为导入新类型而获得预防。在防范“不值得拥有的代码”上,类型系统是你的主要同盟国。 2、预防客户错误的另一个办法是,限制类型内什么事可做,什么事不能做。常见的限制是加上const。 3、除非有好理由,否则应该尽量令你的types的行为与内置types一致。 4、tr1::shared_ptr有一个特别好的性质是:它会自动使

ruan875417的专栏 499

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

《Effective C++(第三版)》读书笔记

结合《Effective C++(第三版)》书和一些技术博客总结的读书笔记,后续还会更新完善 一.让自己习惯C++ 条款01:视C++为一个语言联邦     为了更好的理解C++,我们将C++分解为四个主要次语言: C。说到底C++仍是以C为基础。区块,语句,预处理器,内置数据类型,数组,指针统统来自C。 Object-Oreinted C++。这一部分是面向对象设计之古典守

liaodong1790的博客 841

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Effective C++读书笔记(中)

Effective C++读书笔记(四到六章)

still_wtm的博客 524

Effective C++ | 读书笔记 (一)

这意味着,如果你在一个编译单元中依赖于另一个编译单元中的全局静态对象的初始化结果,你的程序可能会遇到未定义行为,因为那些对象的初始化次序是不确定的。在构造、析构函数中一定只会调用本类中的虚函数。原因:当基类指针(引用)指向子类对象时,如果析构对象通过delete 指针的方式,只会调用基类的析构函数,不会调用子类的析构函数。如果把这个当做是基类,会有问题,析构函数只有声明没有定义,析构函数从派生类到基类的调用时,会发生链接错误。时,先调用基类的构造函数,此时派生类还没有被构造出来,所以调用的是基类的虚函数。

m0_74795952的博客 1042

effective C++ 读书笔记

effective C++ 读书笔记 听说这是一本好书,于是就读了,确实不错。十年以后我再读这本书,应该会有更深的体会。

weixin_58414907的博客 475

Effective C++ | 读书笔记 (四)

对应条款24,这里只是模版实现。规则一致,但它们写法上有所区别了。public:...// 需要隐式转换的接口定义为非成员函数{...};// 使用// 这里会编译错误,2不能隐式转换上面只是把24条款示例改为模版实现,然而模版版本是编译不过的,因为编译器并不知道2要转换为什么。编译器推断不了模版的隐式转换。对于模版我们只能通过friend和inline特性来实现非成员函数的定义。public:...// 这里Rational是Rational<T>的简写形式,在类模版内部可以简写。

m0_74795952的博客 1104

Effective C++_读书笔记

设计与声明。

Mr.Andy的博客 1460

Effective C++(第三版)读书笔记

Effective C++(第三版)读书笔记 文章目录Effective C++(第三版)读书笔记1. 让自己习惯C++01.视C++为一个语言城邦02. 尽量以const, enum, inline 替换 #define03. 尽可能使用const04. 确定对象被使用前已经被初始化2. 构造、析构、赋值运算05. 了解C++默默编写并调用哪些函数06. 若不想使用编译器自动生成的函数,就该明确...

Luven777的博客 392

Effective C++

可增加程序的清晰度并改善程序效率class Apublic:public://绝不class Apublic:public://绝不编写类模板,而它提供于此模板相关的函数支持所有参数隐式转换时,需要为这个类模板增加内部friend函数public://增加friend + 声明 + 定义private:T re, im;

weixin_44332995的博客 1002
上一篇: 《Effective C++第三版》读书笔记——资源管理
下一篇: 自我实现简易的智能指针
darksun9972
博客等级 码龄19年 42粉丝 399原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值