EC读书笔记系列之5:条款9、条款10
条款9 绝不在构造和析构过程中调用virtual函数
记住:
★在构造和析构期间不要调用virtual函数,∵这类调用从不下降至derived class
-----------------------------------------------------------------------------------
一种非正式的说法:在base class构造或者析构期间,virtual函数不是virtual函数,理由:
表面原因:由于base class构造函数的执行早于derived class的constructor,当base class构造函数执行时derived class的成员变量尚未初始化,使用对象内部尚未初始化的成分可不好!
根本原因:在derived class对象的base class构造期间,对象的类型是base class而不是derived class。C++的任何部分包括virtual函数,运行期类型信息(如dynamic_cast和typeid)等等也就那么看待它。
同样的道理也适用于destructor。一旦derived class的destructor开始执行,对象内的derived class成员变量便呈现未定义值,∴C++视它们仿佛不再存在。进入base class的destructor后对象就成为一个base class对象,而C++的任何部分包括virtual函数,运行期类型信息(如dynamic_cast和typeid)等等也就那么看待它。
确定你的constructor和destructor都没有调用virtual函数,而它们调用的所有函数也都服从同一约束!!!
一种替代的解决方案:
由于无法使用virtual函数从base classes向下调用,在构造期间,你可以借由“令derived classes将必要的构造信息向上传递至base class构造函数”替换之而加以弥补。
后加注:理解此问题时,是不要在基类的constructor中调用虚函数!!!
条款10 令operator=返回一个reference to *this
记住:
★令operator=返回一个reference to *this
----------------------------------------------------------
连等时候赋值采用右结合律:
x = y = z = 15; 解释为: x = ( y = ( z = 15 ) );
所以为了实现“连锁赋值”,赋值操作符需返回一个reference指向操作符的左侧实参。
= ,+=, -=, *= 等都这么干
EC读书笔记系列之5:条款9、条款10的更多相关文章
- EC读书笔记系列之16:条款35、36、37、38、39、40
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...
- EC读书笔记系列之1:条款1、条款2、条款3
条款1:视C++为一个语言联邦 记住: ★C++高效编程守则视状况而变化,这取决于你使用C++的哪一部分 C: Object-oriented c++: Template c++: STL 条款2:尽 ...
- EC读书笔记系列之20:条款53、54、55
条款53 不要轻忽编译器的警告 记住: ★严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉 ★不要过度依赖编译器的报警能力,∵不同的编译器对待事情的态度 ...
- EC读书笔记系列之19:条款49、50、51、52
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...
- EC读书笔记系列之18:条款47、48
条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重 ...
- EC读书笔记系列之17:条款41、42、43、44、45、46
条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函 ...
- EC读书笔记系列之15:条款32、33、34
条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个deriv ...
- EC读书笔记系列之14:条款26、27、28、29、30、31
条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ----------------------- ...
- EC读书笔记系列之12:条款22、23、24
条款22 将成员变量声明为private 记住: ★切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. ...
- EC读书笔记系列之11:条款20、21
条款20 宁以pass-by-reference-to-const替换pass-by-value 记住: ★尽量以pass-by-reference-to-const替换pass-by-value.前 ...
随机推荐
- jQuery中设置form表单中action值的方法
jQuery中设置form表单中action值的方法 (2011-03-17 10:18:19) 转载▼ 标签: 杂谈 html代码: <form id="myFormId&quo ...
- MySQL Server 5.0 下载与 安装指南[图文] (安装到非系统路径+设置root账号相应password)
软件下载:点我前往下载 安装需知:相应mysql版本号为V5.0 ------------------------------------------------- 安装步骤例如以下: Step1 首 ...
- 谈谈 css 的各种居中——读编写高质量代码有感
css 的居中有水平居中和垂直居中,这两种居中又分为行内元素居中和块级元素居中,不同的居中用不同方法. 水平居中 1.行内元素水平居中(文本,图片) 给父层设置 text-align:center; ...
- css overflow
overflow-x,overflow-y的值相同等同于overflow overflow-x,overflow-y的值不同,其中一个被赋值visible,另一个被赋值为auto,scroll,hid ...
- css3 transiton
div { width:100px; height:100px; background:yellow; transition-property:width; transition-duration:1 ...
- UIButton 头文件常见属性和方法
UIButton头文件常见属性 1.属性 contentEdgeInsets: default is UIEdgeInsetsZero.设置内容四边距,默认边距为0 @property(nonatom ...
- Linux系统学习笔记:文件描述符标志
文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...
- 【译】Optimize for mobile-移动端优化
移动端优化 由于移动设备有限的CPU处理能力,移动网络的高往返时间,以及移动应用的快速增长,对移动端的理解以及优化相对于PC端来讲变得更加重要.Page Speed Insights 现在可以让你轻松 ...
- WebApp 里Meta标签大全
1.先说说mate标签里的viewport: viewport即可视区域,对于桌面浏览器而言,viewport指的就是除去所有工具栏.状态栏.滚动条等等之后用于看网页的区域.对于传统WEB页面来说,9 ...
- Oracle EBS-SQL (PO-2):检查当月到货补单的记录数.sql
SELECT DECODE(PLLA.FROM_LINE_ID,'-1','手工','','自动创建') 下达方式, rsh.receipt_num ...