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 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
随机推荐
- java继承关系中成员变量,构造方法,成员方法的关系
Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...
- Android 标签的主题样式
Android平台定义的主题样式: android:theme="@android:style/Theme.Dialog" 将一个Activity显示为对话框模式 •andro ...
- settings.xml
<settings> <!--本地仓库.该值表示构建系统本地仓库的路径.其默认值为~/.m2/repository,windows:C:/Users/Administrator/.m ...
- Linux批量修改用户密码
对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用passwd user这样的命名来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect这样的 ...
- SQL基础教程
第一范式: 列仅包含原子值: 没有重复的组. 第二范式: 满足第一范式: 非部分函数依赖.(如果组合键中任何一列值改变,将导致非键列的值需要被更新) 那么,主键是一列(不是组合的)满足第二范式:所有列 ...
- java静态块
一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的 静态代码块的初始化顺序 class Parent{ static String name = &q ...
- linux学习建议
给初学者的建议 注意事项: 1 严格区分大小写,包括命令和文件夹,windows和linux的系统不太一样 2 所有内容都是以文件保存,包括硬件,文件要永久生效,都要写入文件,所以文件命令很重要 3 ...
- 2013年江西理工大学C语言程序设计竞赛(高级组)
A 解法:dfs搜索,注意一个剪枝,否则会超时(听说原本是个dp)? #include<stdio.h> //#include<bits/stdc++.h> #include& ...
- Codeforces Round #370 (Div. 2) C
Description Memory is now interested in the de-evolution of objects, specifically triangles. He star ...
- Storm系列之二——Guaranteeing Message Processing
Storm保证每跳离开spout的消息都会被完全处理.本文介绍Storm是怎么保证每条消息都被完全处理并且作为用户该怎么做才能从Storm的可靠性保证受益. 1.什么叫消息被完全处理? 一个tuple ...