条款一十三:以对象管理资源

1.把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制“确保资源被释放。

2.auto_ptr是个”类指针对象“,也就是所谓”智能指针“,其析构函数自动对其所指对象调用delete。

void f()
{
std::auto_ptr<Investment>pInv(createInvestment());//调用factory函数使用pInv经由auto_ptr的析构函数自动删除pInv
...
}

获得资源后立即放进资源管理对象内。管理对象运用析构函数确保资源被释放。

3.由于auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一对象。

4.两个常被使用的RAII class分别是trl::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。

条款一十四:在资源管理类中小心coping行为。

条款一十五:在资源管理类中提供对原始资源的访问。

class Font
{
public:
...
FontHandle get() const {return f:} //显示转换函数
... }; class Font
{
public:
...
operator FontHandle() const //隐式转换函数
{return f;} }

条款一十六:成对使用new和delete时要采取相同形式

1.如果你在new表达式中使用[],必须在相应的delete表达式中也使用[].如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。

条款一十七:一独立语句将newd对象置入智能指针

1.以独立语句将newd对象存储于智能指针室内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。

条款一十八:让接口容易被正确使用,不易被误用

条款一十九:设计class犹如设计type

2.需要考虑对象如何被创建和销毁;对象的初始化和赋值该有什么样的差别;对象如何被pass by value;什么是对象的合法值;你的新类型是否具有一般化。

条款二十: 宁以pas-by-reference-to-const 替换pass-by-value

1.缺省情况下C++以by value方式(一个继承自c的方式)传递对象至函数。

2.尽量以pas-by-reference-to-const 替换pass-by-value。前者通常比较高效,并可避免切割问题。

3.切割问题:当一个derived class对象以by value 方式传递并被视为一个base class对象,base class的copy 构造函数会被调用,而”造成此对象的行为像个的derived class 对象“的那些特性化性质全被切割掉了,仅仅留下一个base class对象。

4.以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当。

条款二十一:必须返回对象时,别妄想返回其reference

1.绝不要返回point或reference指向一个local stack对象,或返回reference一个heap-allocated对象,或返回point或reference指向一个local static对象而有可能同时需要多个这样的对象。

条款二十二: 将成员变量声明为private

条款二十三:宁以non-member、non-friend替换member函数

1.这样做可以增加封装性,包裹弹性和机能扩充性。

条款二十四:若所有参数皆需类型转换,请为此采用non-member函数

1.如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。

条款二十五:考虑写出一个不抛异常的swap函数

条款二十六:尽可能的延后变量定义式的出现时间

//方法A:定义循环外
widget w;
for(int i=;i<n;++i)
{
w=取决于i的某个值;
....
} //方法B:定义于循环内 for(int i=;i<n;++i)
{
widget w(取决于i的某个值);
....
}

1.做法A:1个构造函数+1个析构函数+n个赋值操作

做法B:n个构造函数+n个析构函数

2.尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。

条款二十七:尽量少做转型动作

条款二十八:避免返回handles指向对象内部成分

条款二十九:为”异常安全“而努力是值得的

1.当异常被抛出时,带有异常安全的函数应当:不泄漏任何资源;不允许数据败坏。

2.异常安全函数提供一下三个保证之一:

1)基本承诺:如果异常被抛出,程序内的任何事物仍然保持有效状态下。

2)强烈保证:如果异常被抛出,程序状态不改变。

3)不抛掷保证:承诺绝不抛出异常,因为它们总是能够完成它们原先承诺的功能。

3.函数提供的“异常安全保证”通常最高只等于其所调用各个函数的“异常安全保证”中的最弱者。

条款三十:透彻了解inlining的里里外外

1.inline函数背后的整体观念是,将“对此函数的每一个调用”都以函数本体替换之。这样就可能增加目标码的大小。

2.inline只是对编译器的一个申请,不是强制命令。这项申请可以隐喻提出,也可以明确提出。隐喻方式是将函数定义于class定义式内。而明确声明inline函数的做法则是在其定义式前面加上关键字inline。

3.将大多数inlining限制在小型、被频繁调用的函数身上。

条款三十一:将文件间的编译依存关系降至最低

Effective C++ 读书笔记(13-32)的更多相关文章

  1. 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...

  2. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  3. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  4. 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)

    强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods) 学习笔记: Reinforcement Learning: An Introduction, Richa ...

  5. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  6. effective c++读书笔记(一)

    很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...

  7. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  8. Effective C++读书笔记(转)

    第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会 ...

  9. Effective java读书笔记

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

  10. Effective Objective-C 读书笔记

    一本不错的书,给出了52条建议来优化程序的性能,对初学者有不错的指导作用,但是对高级阶段的程序员可能帮助不是很大.这里贴出部分笔记: 第2条: 使用#improt导入头文件会把头文件的内容全部暴露到目 ...

随机推荐

  1. Linux进程实践(2) --僵尸进程与文件共享

    孤儿进程与僵尸进程 孤儿进程: 如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程.(注:任何一个进程都必须有父进程) //生成孤儿进程 int main(int argc, cha ...

  2. Android中显示gif动态图片

    在android中显示一个静态图片比如png jpg等等都很方便,但是如果要显示一个gif 动态图片就需要进行一些处理. 本文是采用自定义view 然后进行重新onDraw方法来实现 首先自定义Vie ...

  3. Eclipse/Myeclipse生成serialVersionUID方法

    serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 如果你修改代码重新部署后出现序列化错误,可以考虑给相应的类增加serialVersio ...

  4. (NO.00001)iOS游戏SpeedBoy Lite成形记(十六)

    接上篇,我们实现菜单窗口的弹出和关闭功能,首先在打开GameScene.m,添加必要的实例变量: __weak PopupLayer *_popupLayer; 再添加2个新方法: -(void)re ...

  5. (NO.00001)iOS游戏SpeedBoy Lite成形记(八)

    前一篇提到,如果要想动态修改选手的速度需要在update方法中添加代码. 因为update方法在游戏每一帧都会调用,所以我们不可能修改的太频繁.否则一来对性能有影响,而来玩家表现的极不自然,像抽风一样 ...

  6. Java 开源Wiki:XWiki

    XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台.之前只接触过MediaWiki,但是MediaWiki是用PHP写的,一直想找找看有没有熟悉的JAVA语言的Wiki系统. ...

  7. (二十五)键盘的设置与TextField细节处理

    设置Return Key类型为Send并且勾选下面的复选框即可实现没有内容时禁用keyboard,有内容自动启用. 文本框左边框与文本留有间距的方法: //文本框左侧留下间距 UIView *left ...

  8. Java进阶(五十一)必须记住的Myeclipse快捷键

    Java进阶(五十一)必须记住的Myeclipse快捷键 在调试程序的时候,我们经常需要注释一些代码,在用Myeclipse编程时,就可以用 Ctrl+/ 为选中的一段代码加上以 // 打头的注释:当 ...

  9. C语言关键字static的绝妙用途

    为什么要说static妙,它确实是妙,在软件开发或者单片机开发过程中,大家总以为static就是一个静态变量,在变量类型的前面加上就自动清0了,还有就是加上static关键字的,不管是变量还是关键字, ...

  10. 安卓笔记--Edittext禁止换行

    直接在EditText的xml文件中通过配置android:singleLine="true"把虚拟键盘上的enter键禁止掉,不会显示 <edittext android: ...