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 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
随机推荐
- va_list/va_start/va_arg/va_end深入分析【转】
转自:http://www.cnblogs.com/justinzhang/archive/2011/09/29/2195969.html va_list/va_start/va_arg/va_end ...
- oracle日期函数2!
1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual 当前时间减去7小时的时间 ...
- tcpproxy:基于 Swoole 实现的 TCP 数据包转发工具的方法
假设我们希望有一台机器A(ip 192.168.1.101)要开放端口6379给用户访问,但可能实际情况是用户无法直接访问到A(ip 192.168.1.101), 但却有一台机器B(ip 192.1 ...
- Effective STL
第9条:慎重选择删除元素的方法 删除特定值元素,vector.string.deque用erase-remove:c.erase(remove(c.begin(),c.end(),1963),c.en ...
- hashcode与equals
归纳一下就是hashCode是用于查找使用的,而equals是用于比较两个对象的是否相等的.以下这段话是从别人帖子回复拷贝过来的: .hashcode是用来查找的,如果你学过数据结构就应该知道,在查找 ...
- Python学习笔记-Day2-Python基础之元组操作
元组的常用操作包括但不限于以下操作: 元组的索引,计数等 这里将对列表的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 type(tuple) 使用dir获取类的 ...
- Mysql 升级到 5.6 后插入语句时间字段报错:Incorrect datetime value: '' for column 'createtime'
今天部署服务器项目运行,当遇见有时间数据对象的插入和更新操作的时候,就报错,如下: Caused by: com.mysql.jdbc.MysqlDataTruncation: Data trunca ...
- EasyUI扩展方法
EasyUI扩展方法: 1.我想指定textarea的行,但editor:{type:'textarea', options: {rows:'4'}}这样写不行.请问大家怎么配置才是指定行的啊? 配置 ...
- Myeclipse 添加server library
来自网络资料 (1)File->New->Other (2)弹出窗口勾上Show All Wizards,然后在type fiter text那里输入Server,选中server-> ...
- javascript实现二分查找
今天做了道笔试题,要求是实现二分查找,当然不难,想了一下,因为没有要求语言就用javascript实现了.当然,期间还是出来了一点问题. ok,上代码 /* * 稳定二分查找 * 作者:吴伟欣 * * ...