美·Scott Meyers 候捷 电子工业 2011


刚才看到个会议时间有点晚,3.25论文都提交了

谷歌去广告的插件,

最后投了这个会议,刚刚好正合适。我说金钱与时间


ACCUSTOMING YOURSELF TO CPP 基本须知


1, view c++ as a federation of languages.

c: no templates,no exceptions,no overloading

object c++: c with classes, encapsulation , inheritance,polymorphism,virtual(dynamic resistance

template c++:泛型编程 , meta programming,

stl: containers,iterators,algorithms,function

2, Prefer consts,enums,and inlines to #defines.

enum more like define than const, access address define/enume is invalid.

形式函数的宏用inline:

3,use const whenever possible.

mutable 变量总是可被更改,即使在const 函数内

4,Make sure that objects are initialized before they’re used;

成员初始序列比赋值 更高效。

singleton 的一个常见手法,non-local static –> local static 返回一个local static 指针,可避免初始化的无序情况。


CONSTRUCTORS DESTRUCTORS AND ASSIGNMENT 标准的代码方法


5,Know what functions Cpp silently writes and calls.

6,Explicitly disallow the use of compiler generated functions you do not want.

将成员函数声明为private 而故意不实现

私有继承基类的private

7,Declare destructors virtual in polymorphic base classes.

如果class 不带虚,表示它并不想做基类。

虚析构适用于有多态性质的基类,通过基类接口处理子类对象。

8,Prevent exception from leaving destructors.

析构绝对不要吐异常,析构应该能捕捉任何异常,吞下任何异常

要对异常做反应,应提供一个普通函数

9,Never call virtual functions during construction or desctruction.

因为构造和析构期间调用的virtual从不下降至derived

10,Have assignment operators return a reference to *this.

为了实现链式赋值,操作符必须返回一个reference: *this

11,Handle assignment to self in operator=

identity test.

将原来的用局部副本暂存,最后删除。

copy and swap

12,copy all parts of an object.

确保复杂所有base class 成份

不要在构造内调用拷贝或相反的,应使用第三个函数建立共同机制


RESOURCE MANAGEMENT 解决内存泄漏


13,Use objects to manage resources.

RAII对象 获得资源迅速放进管理对象 Resource acquisition is Initialization;RAII

两个常用的RAII类,管理对象运用析构函数确保资源被释放。

智能指针auto_ptr 复制动作会使被复制对象指向NULL

引用计数RCSP copy行为比较直观

用在基于堆的对象上,析构内做delete

14,Think carefully about copying behavior in resource-managing classes

资源管理类中小心copying行为,提制RAII对象必须复制它们的资源,所以资源的copying行为决定RAII的成败。

常用一:抵制复制,copying声明为private

常用二:底层使用引用计数

深拷贝,复制底部资源

转移底部资源拥有权

15,Provide access to raw resources in resource-managing classes.

在资源管理类中提供对原始资源的访问

显示转换安全,隐式转换方便。

16,Use the same form in corresponding uses of new and delete.

new[] 和 delete[]

17,Store newed objets in smart pointers in standalone statements.

以独立语句将new的对象转入智能指针


Designs and Declarations 设计与声明


18,Make interfaces easy to use correctly and hard to use incorrectly

让接口容易被使用, 不易被误用

int fib1(int n){
    int a =0,c;
    for(int b =1 ,i =2; i<= n; i++){ 
      c = a + b;   a =b;    b = c; 
      }
    return c;
   }

explicit 防止隐式转换的

This keyword is a declaration specifier that can only be applied to in-class constructor declarations. An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object.普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。

引用计数 支持定制型删除器,防止跨DLL问题,自动解除互锁

19,Treat class design as type design 设计class 就像设计type

对象创建和销毁

对象初始化和对象赋值区别

20,Prefer pass by reference to const  to pass by value

规则不适合内置类型/STL迭代器和函数对象。

简单地说,函数对象就是一个重载了()运算符的对象,它可以像一个函数一样使用。

21,Don't try to return a reference when you must return an object.

不要返回指向局部栈的对象,或者需要多个局部静态对象

22,Declare data mebmbers private

将成员变量声明为private.

23,Prefer non-member non-friend functions to member functions.

增加封闭性和扩充性

24,Declare non-member functions when type convrsons should apply to all parameters.

要为某个函数的所有参数进行类型转换,必须是非成员函数。

25,Consider support for a non-throing swap.

如果提供一个成员函数,也应该提供一个非成员函数调用前者,调用swap时使用using



IMPLEMETATIONS


26,Postpone variable definitions as long as possible.

27,Minimizing casting

避免dynamic_cast

转型隐藏于函数之后,

使用C++式转型

28,Avoid returning handles to object internal.

29,Strive for exception safe code.

30,Understand the ins and outs of inlining.

大多数是编译期行为

31,文件间的编译依存降至最低

依赖声明式,不依赖定义式



INHERITANCE AND OOD


32,确定public 是is a 继承

33,Avoid hiding inherited names.

34,Differentiate between inheritance of interface and inheritance of implementation.

35,考虑虚函数外的其它选择

设计模式

36,绝不重新定义继承过来的非虚函数

37,Never redefine a function inherited default parameterv alue.

虚函数是动态绑定,缺省参数是静态绑定,

38,复合出has a 或者根据某物实现

39,Use private ihneritance judiciously

尽可能复合,必要才private继承

40,Use multiple inheritance judiciously.



TEMPLATE AND GENERIC


41,Understand implicit interfaces and compile timpe polymorphism.

以不同的template参数具体化函数模板,会导致调用不同的函数,这是所谓编译多态。哪一个函数被重载调用。

虚函数绑定是运行期

42,Understand the two meanings of typename.

43,Know how to access names in templatized base classes.

44,Factor parameter independent code out of templates.

45,Use member function templates to accept all compatible types.

46,Define non member functions inside templates when type conversions are desired.

47,请使用traits class 表现类型信息,使类型信息在编译期可用

48,Be aware of template meta programming



NEW AND DELETE


49,Understand the behavior of the new handler.

50,Understand when it makes sense to replace new and delete.

51,Adhere to convention when writing new and delete.

52,placement new and placement delete



MISCELLANY


53,Pay attention to compiler warnings

54,Familiarize yourself with the standard libray, including TR1

不熟悉TR1却奢望成为C++高手 是不可能的。

55,让自己熟悉Boost


我昨天泡在图书馆一天把这本书解决掉了。虽然因为手机关机连过去多少时间都不知道那时还没意识到中午饭都没吃倒也还是挺高兴的,

我觉得图书馆看书的好处是很快,坏处是记不得。结论是好书读一遍是不够的。

Effective C++ 改善55个方法的更多相关文章

  1. <More Effective C#: 改善C#代码的50个有效方法>中文版翻译答疑

    最近, 有一本很赞的.NET技术书中文版出版了 - <More Effective C#: 改善C#代码的50个有效方法>.    从广州\西安\长沙\上海等各地.NET俱乐部都收到反馈, ...

  2. Effective C++ 的55个条款

    看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言 ...

  3. Effective C++笔记 55条编程法则

    1.  视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 2.  尽量以const,enum.inline替代#define 1) 对于单纯常量,最好以const ...

  4. Effective Java —— 用静态工厂方法代替构造器

    本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...

  5. Effective Java 读书笔记之六 方法

    一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性 ...

  6. [Effective Java]第七章 方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. Effective Java (7) - 避免终止方法

    一. 基本概念 1. 所谓的终结方法事实上是指finalize(). 2. Java的垃圾回收机制仅仅负责内存相关清理.其它资源的清理(释放文件.释放DB连接)须要程序猿手动完毕. 3. 调用Syst ...

  8. Day 5-5 绑定方法与非绑定方法

    绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...

  9. Effective JavaScript Item 55 接受配置对象作为函数參数

    接受配置对象作为函数參数 尽管保持函数接受的參数的顺序非常重要,可是当函数可以接受的參数达到一定数量时.也会让用户非常头疼: var alert = new Alert(100, 75, 300, 2 ...

随机推荐

  1. 比较C++、Java、Delphi声明类对象时候的相关语法

    同学们在学习的时候经常会遇到一些问题,C++.Java.Delphi他们到底有什么不一样的呢?今天我们来比较C++.Java.Delphi声明类对象时候的相关语法.希望对大家有帮助! C++中创建对象 ...

  2. Spring Data JPA初使用 *****重要********

    Spring Data JPA初使用 我们都知道Spring是一个非常优秀的JavaEE整合框架,它尽可能的减少我们开发的工作量和难度. 在持久层的业务逻辑方面,Spring开源组织又给我们带来了同样 ...

  3. position与offset的区别

    .offset()是相对于文档(document)的当前位置,.position()是相对于父级元素的位移,一个元素可以嵌套多个position

  4. [GO]结构体指针类型匿名字段

    package main import "fmt" type Person struct { name string sex byte age int } type Student ...

  5. java修饰符 protect public protected

    1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员(子类是可以访问父类的带protected修饰符的成员的 ...

  6. java IO类简单介绍

    一.流的概念 流是字节序列的抽象概念.流和文件的差别:文件是数据的静态存储形式,而流是指数据传输时的形态.文件只是流的操作对象之一.流按其操作的对象不同可以分为文件流.网络流.内存流.磁带流等.Jav ...

  7. C#中的异步调用及异步设计模式(二)——基于 IAsyncResult 的异步设计模式

    三.基于 IAsyncResult 的异步设计模式(设计层面) IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来 ...

  8. Maven整理笔记のMaven仓库

    Maven坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式:而构件的物理表示方式是文件,Maven通过仓库来统一管理这些文件.  Maven仓库 在Maven的世界中,任何一个依赖.插件或者项 ...

  9. linux 常见命令--系统信息部分

    head -n 1 /etc/issue    #查看操作系统 cat /etc/redhat-release  #查看linux系统版本 cat /proc/meminfo |grep MemTot ...

  10. Delphi xe5如何使用Bluestacks模拟器(用真机或者用猩猩,夜神模拟器,自带的不好用)

    首先,关于这个模拟器问题比较纠结,这是一个关于adb的问题. Delphi XE5会自动识别模拟器和真机,但是你必须先打开模拟器在打开Delphi IDE(Delphi开发环境),否则还得麻烦一会儿. ...