More Effective C++ (1)
简单分析总结了more effective c++ 的前十个条款:
剩下的条款to be continue~
1.仔细区分指针和引用
引用必须不能指向空,指针可以指向空,指针初始化是记得赋空值,
重载某些操作符时(例如[])应该返回引用。
2.最好使用C++转型操作符
旧式的C转型应该少用,尽量使用新的C++的转型
static_cast<type> (expression)基本上与旧式C转型具有相同的威力与意义。
const_cast<type> (expression)用于改变表达式的常量性和变易性(volatileness)。
type必须是指针,引用,指向指针的引用。
dynamic_cast<type> (expression) 用于执行继承体中“安全的向下转型和跨系转型动作”。
type必须是指针,引用,指向指针的引用。
子类能转型为父类(向下转型),父类不能转型为子类(向上转型)。
如果转型失败将会返回一个null指针。
reinterpret_cast<type> (expression)
type必须是指针,引用,指向指针的引用。
主要用于“函数指针”类型转换。也可用于类型转换。
子类能转型为父类(向下转型),父类能转型为子类(向上转型)。
3.绝对不要以多态方式处理数组。
因为内存中,array[10],array 和 array + i 所指的内存多远是确定的,如果用子类访问(子类通常会
比基类大)将产生不可预计的后果。用基类指针删除一个子类数组上述情况还是会发生(析构时)。
4.非必要不提供default constructor。
某些类必须借助外部信息进行初始化才能使类有意义,如果没有default constructor,那么将不能创建数组,
虽然可以用数组指针创建,不过操作会比较麻烦,内存消耗也会增加。过度使用内存可以给数组分配raw memory
解决(条款8)。缺乏default constructor 将不适用于许多模板容器类。不过也不要构建无意义的default constructor,
因为这样做可能会带来更多的问题。
5.对定制的“类型转换函数”保持警觉。
隐式类型转换造成的错误通常难以发现,编译器在错误的表达式中会尽量寻找合适的隐式类型转换使得表达式有意义,
为避免隐式转换,(1)将重载操作符()功能用成员函数替代 (2)构造函数声明为explicit 或 为当前类编写一个
专用类(代理人一般),因为编译器不允许进行两次隐式类型转换。
6.自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
前缀式通常比后缀式效率要高些
// 前缀形式:增加然后取回值
UPInt& UPInt::operator++()
{
*this += 1; // 增加
return *this; // 取回值
}
// postfix form: fetch and increment
const UPInt UPInt::operator++(int)
{
UPInt oldValue = *this; // 取回值
++(*this); // 增加
return oldValue; // 返回被取回的值
}
7.不要重载“&&”,“||”, 或“,”
与 C 一样,C++使用布尔表达式短路求值法(short-circuit evaluation)。这表示一旦
确定了布尔表达式的真假值,即使还有部分表达式没有被测试,布尔表达式也停止运算。
8.理解各种不同含义的 new 和 delete
new 操作符为分配内存所调用函数的名字是 operator new
有时你有一些已经被分配但是尚未处理的(raw)内存,你需要在这些内存中构造一个对象。你可以
使用一个特殊的 operator new ,它被称为 placement new。
例如:new (buffer) Widget(widgetSize); //指向一个 Widget 对象,对象在转递给函数的 buffer 里分配。
如果你只想处理未被初始化的内存,你应该绕过 new 和 delete
操作符,而调用 operator new 获得内存和 operator delete 释放内存给系统.
如果你用 placement new 在内存中建立对象,你应该避免在该内存中用 delete 操作符。
而你应该显式调用对象的析构函数来解除构造函数的影响.
Array分配时1.用operator new []分配 2.在数组里的每一个对象的构造函数都必须被调用。
同样当 delete 操作符用于数组时, 它为每个数组元素调用析构函数, 然后调用 operator delete 来释放内存。
9.使用析构函数防止资源泄漏。
应该注意使用智能指针防止出现异常时的资源泄露。相关的窗口创建也可应用这种思想。
10.在构造函数中防止资源泄漏。
构造函数执行过程中可能会出现异常,可以在构造函数内部捕获异常释放资源并抛出解决,但是更好的方法
是使用智能指针,它能使对象像内部数据类型一样更好的解决资源泄露问题。
More Effective C++ (1)的更多相关文章
- Effective前端2:优化html标签
div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- 《Effective java》-----读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...
- 《Effective Java》学习笔记——积累和激励
从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...
- Effective前端5:减少前端代码耦合
什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天.由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: ...
- Effective前端4:尽可能地使用伪元素
伪元素是一个好东西,但是很多人都没怎么用,因为他们觉得伪元素太诡异了.其实使用伪元素有很多好处,最大的好处是它可以简化页面的html标签,同时用起来也很方便,善于使用伪元素可以让你的页面更加地简洁优雅 ...
- Effective前端3:用CSS画一个三角形
p { text-indent: 2em } .triangle-container p { text-indent: 0 } img { margin: 15px 0 } 三角形的场景很常见,打开一 ...
- Effective前端1:能使用html/css解决的问题就不要使用JS
div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- effective java 读后感
think in java , effective java 这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
随机推荐
- spin_lock、spin_lock_irq、spin_lock_irqsave区别【转】
转自:http://blog.csdn.net/luckywang1103/article/details/42083613 void spin_lock(spinlock_t *lock); voi ...
- grd文件结构
- JS和CSS的多浏览器兼容(1)
1.指定文件在IE浏览器中的兼容性模式 要为你的网页指定文件模式,需要在你的网页中使用meta元素放入X-UA-Compatible http-equiv 标头.以下是指定为Emulate IE7 m ...
- diff 文件比较
测试数据: [xiluhua@vm-xiluhua][~]$ cat msn.txt aaa bbb bbb ccc ccc ddd bbb eee aaa ccc bbb sss [xiluhua@ ...
- easyui设置界面的高度自适应
单独设置界面中特定region区时,高度自适应失败:设置整个界面时成功.实现代码在script块中,具体代码如下: <%@ Page Language="C#" AutoEv ...
- Linux是如何管理内存的
物理内存的管理 Linux管理物理内存是使用分页机制实现的.为了使分页机制在32位和64位体系结构下高效工作,Linux采用了一个四级分页策略. Linux支持多种内存分配机制.分配物理内存页框的主要 ...
- 《python核心编程》读书笔记--第16章 网络编程
在进行网络编程之前,先对网络以及互联网协议做一个了解. 推荐阮一峰的博客:(感谢) http://www.ruanyifeng.com/blog/2012/05/internet_protocol_s ...
- 算法大全(c,c++)
http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):in ...
- 从客户端中检测到有潜在危险的 Request.Form 值
今天在使用Kindeditor的时候,出现了如题的错误. 错误如图: 百度了下,艰难的找了原来是Framework的问题,原来用的2.0,后面变成了4.0,验证级别也更高了: 解决办法:在config ...
- UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图
面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML ...