Effective C++笔记6

<<More Effective C++>>读书笔记6: 杂项 《More Effective C++》+《Effective C++》,两本经典双剑合璧,必然威力无穷。     Item M32:在未来时态下开发程序 1. 用C++语言自己来表达设计上的约束条件,而不是用注释或文档。    [很好的思想,但需要熟练掌握C++特性] 2. 因为万物都会变化,要写能承受软件发展过程中的混乱攻击的类。 3. 要使得自己的类易于被正确使用而难以误用 阅读详情

 本文内容基本来自于《Effective C++》一书,为学习后的笔记,以便温故。

《Effective C++ 》第 6节  继承与面向对象设计

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

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

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

          derived classes内的名称会遮掩base classes内的名称,在public继承下从来没有人希望如此。

          为了让被遮掩的名称在再见天日,可使用using声明式或者转交函数。

(3)条款34:区分接口继承与实现继承

           接口继承与实现继承不同,在public继承之下,derived classes总是继承base classes的接口。

           pure virtual函数只具体制定接口继承

           简朴的impure virtual函数具体制定接口继承及缺省实现继承

           non-virtual函数具体指定接口继承以及强制性实现继承

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

          藉由non-virtual interface手法实现 template method模式 

         这种流派主张virtual函数应该几乎总是private。较好的设计是使用一个non-virtual的public成员函数作为对外的接口,并调用一个private virtual函数进行实际工作。 

         藉由Function Pointers实现strategy模式

         这种方法主张类中接受一个函数指针,指向要执行的动作。从而实现不同的策略。

         藉由tr1::function完成strategy模式

         这种方法不再使用函数指针,而是改用一个类型为tr1::function的对象。

         定义式:typedef std::tr1::function<int (const GameCharacter&)>HealthCalcFunc;

         这个签名代表的函数“接受一个reference指向const GameCharacter,并且返回int”。这个tr1::function类型产生的对象可以持有任何与签名式兼容的可调用物。所谓兼容,意思是这个可调用物的参数可被隐式转换成const GameCharacter&,而其返回类型可被隐式转换为int。(这种方法没有明白,还要继续研究。)

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

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

            virtual函数是动态绑定,而non-virtual则是静态绑定,缺省参数值是静态绑定。

           静态绑定就是他在程序中被声明时所采用的类型,动态类型是指“目前所指对象的类型”。也就是说,动态类型可以表现出一个对象将会有什么行为。

           例如:class Shape{

                         public:

                               virtual void draw(ShapeColor color =Red)const = 0;

                       }

                      class Rectangle:public Shape{

                       public:

                          virtual void draw(ShapeColor color =Green) const ;

                       }

                      Shape* pr = new Rectangle();

                      pr->draw();        //此时默认的参数不是Green而是Red,因为,缺省参数值静态绑定!

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

          复合的意义和public继承完全不同

          在应用领域中,复合意味着has-a。在实现领域中,复合意味着is-implemented-in-terms-of(根据某物实现出),例如通过list实现set。

(8)条款39:明智而审慎地使用private继承

          Private继承意味is-implemented-in-terms of。它通常比复合的级别低。但是当derived class需要访问protected base class的成员,或者需要重新定义继承而来的virtual函数时,这样设计是合理的。

         和复合不同,private继承可以造成empty base最优化。这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要。

(9)条款40:明智而审慎地使用多重继承

         多重继承比单一继承复杂,它可能导致新的歧义性,以及对virtual继承的需要。

        virtual继承会增加大小,速度,初始化复杂度等成本。如果virtual base classes不带任何数据,将是最具实用价值的情况

        多重继承的确有正当用途,其中一个情节涉及“public 继承某个Interface class”和“private继承某个协助实现的class”的两相组合。

         

        

         

手把手复现金蝶云星空V8.1文件上传漏洞(附完整POC与修复方案) 本文深度解析金蝶云星空V8.1文件上传漏洞,提供详细的漏洞复现步骤与完整POC,涵盖技术原理、测试环境搭建及验证流程。同时给出多维防护方案,包括官方补丁部署、临时缓解措施和长期安全加固建议,帮助企业有效防范任意文件上传风险。 阅读详情

相关推荐

EastWave应用案例:机箱屏蔽效能仿真

如何使用EastWave对机箱的电磁屏蔽效能进行仿真

2201_76034687的博客 1395

《Effective C++》 读书笔记 条款6-10

Effective C++ 6-10 Note 条款06:若不想使用编译器自动生成的函数,就明确拒绝 在老版的C++中,将不想自动生成的函数声明为private并且不定义 在当前版本的C++中,可以使用delete修饰符进行修饰 条款07:为多态基类声明virtual析构函数 带多态性质的基类应该声明一个虚析构函数,如果类带有任何虚函数,它就应该有一个虚析构函数 当出现基类指针或引用指向派生类对象时,如果析构函数不为虚函数,那么调用的就是静态对象的析构函数,也就是基类的析构函数,这会导致派生类的派生部分没

youyadefeng1的博客 282

Tesla V100 Windows 部署实战:从驱动安装到模式切换的避坑指南

本文是一份详细的Tesla V100在Windows系统下的部署实战指南。文章从硬件组装、系统选择讲起,重点阐述了驱动安装的正确方法,并深入剖析了将计算卡从TCC模式切换至WDDM模式的诱惑与潜在陷阱。最终,作者推荐保持默认TCC模式,并提供了使用nvidia-smi命令行等稳定可靠的显卡监控方案,旨在帮助用户避开常见坑点,高效利用这张专业计算卡进行AI计算等任务。

java5的博客 1711

Effective cpp 读书笔记6

26.尽可能延后变量定义时的出现时间 27.尽量少做转型动作 28.避免返回handles指向对象内部成分 29.为“异常安全”而努力使值得的 30.透彻了解“inlining”的里里外外 31.将文件间的编译依存关系降至最低

GZGlenn的博客 438

AC360变频器使用案例

AC360变频器使用案例!

QING_BOSS的博客 517

如何利用PREEvision和MATLAB开发AUTOSAR软件组件

在业界,比较著名的电子电气架构开发工具要属德国Vector公司开发的PREEvision工具了,而MATLAB/Simulink软件是非常高效且实用的基于模型的应用软件开发工具。利用PREEvision与Simulink联合开发AUTOSAR应用软件组件的开发流程有三种,分别是:“自上而下”开发流程(从PREEvision开始),“自下而上”开发流程(从Simulink开始),以及“双向”开发流程。如下图所示,无论哪一种开发流程,PREEvision与Simulink工具都是通过arxml文件进行信息交互的

怿星科技的博客 5396

Effective C++ 阅读笔记之Chapter6

前言 大家好,我是雨墨,我深知好记性不如烂笔头的道理,所以在阅读的时候都尽量写读书笔记,方便日后复习,当然笔记并不能代替书籍上的内容。希望我的笔记也能帮助到大家,如果我的笔记有什么问题,欢迎大家给小老弟纠错~ 条款三十二总结 public 继承就是 is-a !!! 适用于 base class 身上的每件事情也一定适用于 derived class ,因此在设计 public 继承的时候一定要考虑这一点,多想想企鹅和鸟、矩形和正方形之间的关系。 条款三十三总结 注意:在 public 继承下掩盖名称违背了

qq_51387669的博客 330

PCL 计算点云的体积密度(C++详细过程版)

本文提出了一种基于点云体积密度的计算与可视化方法。算法通过KdTree搜索每个点的邻域,利用球体积公式计算单位体积内的点数作为密度值,并存储在点云强度属性中。代码实现了点云读取、密度计算和可视化功能,使用PCL库完成邻域搜索和密度渲染。结果显示,该方法能有效反映点云密度分布,为后续点云处理提供密度特征参考。文章附有完整C++代码实现和可视化效果图,适用于点云密度分析和特征提取应用。

点云侠的博客 308

【Effective C++】阅读笔记6

模板与泛型编程与new和delete

gma999的博客 928

基于STM32设计的物联网疫苗冷链物流监测系统

本设计基于物联网技术,开发了一套疫苗冷链物流环境监测系统。系统采用STM32F103C8T6作为主控芯片,集成SHT30温湿度传感器、震动传感器、GPS定位模块和4G通信模块,实现对运输环境的温度、湿度及震动状况的实时监测与控制。通过继电器驱动半导体制冷模块和加湿器,系统能够自动调节环境温湿度,保障疫苗运输的安全性。采集的环境数据通过MQTT协议上传至华为云物联网平台,配套开发的Android手机APP和Windows上位机软件基于Qt平台设计,支持远程实时查看环境数据和车辆定位,提升了疫苗冷链运输的智能化

863

【Unity 实用工具篇】✨| I2 Localization 实现本地化及多种语言切换,快速上手

Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的插件:I2 Localization 。

努力前行,总会成为自己心中的那道光 3万+

《Effective C++》笔记汇总_思维导图 chap6

6.继承与面向对象设计 下面是思维导图的截图,资源发在Github上了,需要的朋友自取 《Effective C++》chap6:继承与面向对象设计 一些话儿 本人水平有限,如果笔记中有错误或是遗漏的地方,还请大家体谅。 这份笔记花了小生非常多的时间与精力,如果能帮到你对C++的学习,点个赞即可! ...

qq_43596544的博客 246

YOLOv11改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 779

Effective C++笔记 (5-6)

上面这个类声明了两个有参构造函数,所以编译器就不会再为它生成一个无参的默认构造函数。这意味着如果你想要无参构造,你就得手动写出来。编译器该怎么做(或说 “我不允许赋值” 也行,比如用 = delete;一个合乎你需求语义的 operator=,在实现中。“赋值”这样一个对象,那么只能。

limingkang1的博客 1129

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Effective C++学习笔记(6)

条款17: 在operator=中检查给自己赋值的情况    1. 用值相等来确定对象身份和两个对象是否占用相同的内存没有关系, 有关系的只是它们所表示的值c& c::operator=(const c& rhs) {     // 检查对自己赋值的情况     if (*this == rhs) // 假设operator=存在         return *this;...}注意这个函数比较

344

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Effective C++ 小笔记:条款3-6

Effective C++ 条款3 1、在一个函数声明式内,const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。 2、许多人漠视一个事实:两个成员函数如果只是常量性(constness)不同,可以被重载。这实在是一个重要的C++特征。包括const修饰成员函数本身,或者成员函数的返回值。 3、const成员函数不可以更改对象内任何non-static成员变量...

weixin_34117522的博客 98

计算机控制技术及应用

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

More Effective C++读书笔记6

Item 6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别 class UPInt { public: ... UPInt& operator++(); //前缀形式 const UPInt operator++(int); //后缀形式 UPInt& operator--();

IT江湖的刀光剑影 1071

Effective C++ 读书笔记6

4 设计与声明 条款18:让接口容易被正确使用,不易被误用 条款19:设计class犹如设计type 条款20:宁以pass-by-reference-to-const替换pass-by-value by value方式比by reference方式成本大,因为会调用类的拷贝构造函数,销毁时会调用析构函数,如果类内还有类,对应的类的拷贝构造函数和析构函数都会被调用,

liyongOFDM的专栏 637

《Effective c++》Chapter6 读书笔记

Chapter6 条款32:确定你的public继承塑模出is-a关系 "public继承"意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived class对象也都是一个base class对象. 条款33:避免遮掩继承而来的名称 derived classes内的名称会遮掩base class内的名称。只要名称相同就会被覆盖,无论函数参数是否相同,也无论是virtual还是non-virtual(见下例) 为了让被遮掩的

qq_39621037的博客 230

Effective C++ ---读书笔记: 6

TODO,待补充

qingyuanluofeng的专栏 167

More Effective C++学习笔记(6)

学习并实践新的C++语言特性、模板特性、异常处理机制、转型、内存分配、标准模板库STL等等。

weixin_44248258的博客 412

Item 6:禁用那些不需要的缺省方法 Effective C++笔记

Item 6: Explicitly disallow the use of compiler-generated functions you do not want. 在C++中,编译器会自动生成一些你没有显式定义的函数,它们包括:构造函数、析构函数、复制构造函数、=运算符。 关于这些函数是的调用时机可以参考:那些被C++默默地声明和调用的函数。 这些默认生成的函数给我们的类

分享技术,共建开放平台 943

Effective C++ 读书笔记(6)

条款六:如果不想使用编译器自动生成的函数,就应该明确的拒绝(不要搞暧昧!) C++是一个比较复杂的语言,包含的模块比较多,我们写程序的一个原则就是不用的功能就要明确的禁止掉,这样就会防止 在意想不到的情况下出现调用,C++瞒着你在背后做了太多的事情了! 对于一个独一无二的对象,例如前面的People对象,每个人都是唯一的,因此我们不想在People类中出现copy构造函数和

nosmatch的专栏 659

《Effective_C++》读书笔记6

条款41、了解隐式接口和编译期多态 1)classes和templates都支持接口(interface)和多态(polymorphism)。 2)对classes而言接口是显式(implicit),奠基于有效表达式。多态则是通过template具现化和函数重载解析(function overloading resolution)发生于编译期。 条款42、了解typename的双重意义

lanyzh0909的专栏 821

Effective C++ 学习笔记6

条款6:析构函数里对指针成员调用delete 添加一个指针成员的流程: 1.在构造函数中对指针进行初始化:对内存进行清0操作,然后通过赋值操作符分配新的内存(分配内存,或者赋值0); 2.析构函数里头delete指针(空指针也可以直接delete)。 如果在析构函数中没有删除指针,它不会表现出明显的症状,不断增长的内存泄露会最终侵蚀你的地址空间。

You can you up 539

effective c++读书笔记 条款5 条款6 条款7

#ifndef CLAUSE_5_H #define CLAUSE_5_H//条款5 了解C++默默编写并调用哪些函数//知识点:编译器可以暗自为class创建default构造函数,copy构造函数,copy assigment操作符,以及析构函数//生成时机:惟有这些函数被需要时(调用),它们才会被编译器创建出来。//但是当打算在一个有reference成员的class内支持赋值操作,你必须自己

Peach_CodeRider的博客 671
上一篇: Ubuntu下mysql忘记密码的解决办法
下一篇: 区别pointers和references
csc_csc_csc
博客等级 码龄15年 169粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值