简单分析总结了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)的更多相关文章

  1. Effective前端2:优化html标签

    div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...

  2. Effective java笔记(二),所有对象的通用方法

    Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...

  3. 《Effective java》-----读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  4. 《Effective Java》学习笔记——积累和激励

    从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...

  5. Effective前端5:减少前端代码耦合

    什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天.由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: ...

  6. Effective前端4:尽可能地使用伪元素

    伪元素是一个好东西,但是很多人都没怎么用,因为他们觉得伪元素太诡异了.其实使用伪元素有很多好处,最大的好处是它可以简化页面的html标签,同时用起来也很方便,善于使用伪元素可以让你的页面更加地简洁优雅 ...

  7. Effective前端3:用CSS画一个三角形

    p { text-indent: 2em } .triangle-container p { text-indent: 0 } img { margin: 15px 0 } 三角形的场景很常见,打开一 ...

  8. Effective前端1:能使用html/css解决的问题就不要使用JS

    div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...

  9. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  10. effective java 读后感

    think in java  , effective java  这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...

随机推荐

  1. xhr dojo load

    require(["dojo/_base/xhr"], function(xhr) { // Execute a HTTP GET request xhr.get({ // The ...

  2. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.2.jqGrid Model-View-Controller 分离

    1 基本 分离代码 和 描述 ,在ASP.NET MVC 应用程序中是非常重要的.因此,jqGrid 的 mvc 模式使用一个共同的网格安装设置,包括 Model ,Controller 和 View ...

  3. C++:FMC 错误

    1.generated debug assertion -- File: docsingl.cpp Line: 215 MFC程序vs2008编译通过,运行时出错,无法打开,提示f:\dd\xxxx的 ...

  4. CI分页,搜索之后翻页不能用问题

     最近在学习用php的CI框架写一个自己的CMS,遇到了些问题.其中一个就是CI分页的时候,我的URL带有其他参数,才能查出我想要的数据.于是我翻遍了谷歌度娘,终于找到了解决办法,和我想的差不多,就贴 ...

  5. jquery闭包的使用

    <div id="divTest"> Test </div> <br /> <hr /> <div id="divT ...

  6. vi编辑文件E437: terminal capability "cm" required 解决办法

    E437: terminal capability "cm" required 这个错误一般是环境变量TERM没有配置或者配置错误所致. 解决办法: 执行export TERM=x ...

  7. httpclient4.3.6/httpcore-4.4自己封装的工具类

    引入jar包 httpclient4.3.6/httpcore-4.4 package com.develop.util; import java.io.IOException; import jav ...

  8. xcode下编译.a文件的路径

    http://www.it165.net/pro/html/201503/36842.html 每当我们编译之后, 实际上系统就给我编译好了一个可以运行的.app文件,在某个路径下 如果我们建立的是静 ...

  9. Struts2的处理结果(四)——PreResultListener监听器

    Struts2的处理结果(四) --PreResultListener监听器 1.PreResultListener是一个监听器接口,他在Action完成控制处理之后,系统转入实际物理视图资源之间被回 ...

  10. Windows7下安装搭建Ngnix教程

    简介: Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由 Igor Syso ...