Effective C++阅读笔记(一)

0. 导读

学习程序语言根本大法是一回事;学习如何以某种语言设计并实现高效程序设计是另一回事

术语:

  • 声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节。
  • 签名式(Dignature):(函数)参数和返回类型。
  • 定义式(Definition):提供编译器一些声明式所遗漏的细节。
  • 初始化(Initialization):给予对象初值的过程。
    • 对象初始化:default构造函数 copy构造函数 pass by value
  • STL(Standard Template Library):标准模板库。
  • 不明确行为(Undefined Behavior):无法稳定预估运行期会发生什么事。
  • 接口(Interface):本书中是指函数的签名或class的可访问元素,或是针对某template类型参数需为有效的一个表达式。指的是一般性的设计观念。
  • 客户(Client):~
  • ctor:构造函数
  • dtor:析构函数

命名习惯

- lhs:left-hand side

- rhs:right-hand side

- pt:pointer to T

- rw:reference to W

- mf:member function

重点内容

- TR1(Technical Report 1):一份描述加入C++标准程序库的诸多新机能的规范。

- Boost:网站,是一个提供可移植、同僚复审、源码开放的C++程序库。

1.让自己习惯C++

条款01:视C++为一个语言联邦

组成C++的四个次级语言(sublanguage):

  • C
  • Object-Oriented C++
  • Template C++
  • STL

请记住:

C++高效编程守则视情况而变化,取决于你使用C++的哪一部分。

条款02:尽量以const,enum,inline替换#define

宁可以编译器替换预处理器,即尽量少用预处理器。

编译过程:

Created with Rapha?l 2.1.0.c文件预处理.i文件编译.o文件链接bin文件

情况一:对于单纯常量,最好以const对象或者enums替换#defines

例:

#define ASPECT_RATIO 1.653

替换为:

const double AspectRatio = 1.653;

解释:记号名称ASPECT_RATIO也许从未被编译器看见,也许在编译器开始处理源代码之前它就被预处理器移走了。即编译源代码时ASPECT_RATIO已被1.653取代。ASPECT_RATIO可能并未进入记号表(symbol table)。

好处:进行了类型检查;代码量变小。

使用const替换#define时的两种特殊情况:

情况一: 定义常量指针

const char* const name = "Lion";

或者直接使用string对象,相对方便:

const std::string name("Lion");

情况二:类专属常量

static const int NumTurns = 5;  //static 静态常量,所有对象只有一份拷贝。

如果你使用的编译器不允许“static成员”在其声明式上获得初值,或者所谓的“in-class初值设定”也只允许对整数常量进行。你可以将初值放在定义式中:

class CostEstimate{
private:
    static const double Ratio;
    ...
};
const double CostEstimate::Ratio = 0.15;

还有一种例外就是当你在class编译期间需要一个class常量值,这是可以使用枚举型进行补偿,例如:

class GamePlayer{
private:
    enum{ NumTurns = 5};
    int scores[NumTures];
    ...
};

取一个const的地址是合法的,但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。如果你不想让别人获取一个pointer或者reference指向你的某个整数常量,enum可以帮助你实现这个约束。

情况二:对于形似函数的宏(macros),最好改用inline函数替换#defines

例:

#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
int a = 5, b = 0;
CALL_WITH_MAX(++a,b);   //a被累加两次
CALL_WITH_MAX(++a,b+10);    //a被累加一次

替换为:

template<typename T>
inline void callWithMax(const T& a, const T& b)
{
    f(a>b?a:b);
}

(未完待续,2015年7月1日)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 16:29:53

Effective C++阅读笔记(一)的相关文章

Effective C++ 阅读笔记_条款27 尽量少做转型动作

Effective C++ 阅读笔记_条款27 尽量少做转型动作 1.转型的三种形式,可以分为两大类. (1)旧式转型(old-style casts) (1.1) (T) expresstion (1.2) T (expression) (2) 新式转型(c++-style casts) (2.1)const_cast<T> (expression) (2.2)dynamic_cast<T> (expression) (2.3)reinterpret_cast<T>

Effective Java阅读笔记——创建和销毁对象(一)

类通常提供一个公有的构造器方法,以此来让客户端可以获取自己(类)的一个实例.但是在创建对象时,应该首先考虑利用静态工厂方法代替构造器来返回一个实例.利用静态工厂方法而不是公有的构造器有几个优势: 静态工厂方法有(不同的)名字 构造器方法都有相同的名字,就是类的名字.区分不同构造器的方法是通过观察方法的签名确定的.方法的签名包括方法名,方法参数的类型,数目以及顺序,方法的返回类型不是方法签名的一部分.无法通过构造器方法名区分不同的构造器,只能通过参数的不同区分,这种情况下(特殊情况下有可能参数类型

Effective Java 阅读笔记——方法

38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违反参数值限制会抛出的异常 对于非公有的方法,通常使用断言来检查他们的参数:断言如果失败,抛出AssertionError:如果没有起到作用,本质上也不会有成本开销 private void sort(long a[]){ assert a != null; } 对于构造函数中的,或者参数将会被保存,

iOS -- Effective Objective-C 阅读笔记 (3)

1:  理解 属性 的概念 属性会自动生成存取方法,  可以利用点语法调用, 若不想编译器自动合成存取方法, 可以自己实现, 还有另外一种方法, 就是使用 @dynamic 关键字, 它会告诉编译器, 不要自动创建实现属性所用的实例变量 和 存取方法,   而且,在编译访问属性的代码时, 即使编译器发现没有定义存取方法,  也不会报错, 它相信这些方法会在运行期找到, 使用方法是, 在 头文件中(.h 文件) 定义属性, 在 实现文件 (.m 文件) 使用 @dynamic 属性名; 定义了属性

Effective Java 阅读笔记——并发

66:同步访问共享的可变数据 synchronized:1互斥,阻止线程看到的对象处于不一致的状态:2保证线程在进入同步区时能看到变量的被各个线程的所有修改 Java中,除了long或者double,“读”或者“写”一个变量是原子的.注意:是读或者写单个动作是源自的,而不是读写这两个动作整体是原子的. 由于虚拟机会对代码进行优化,所以可能会导致一些错误:可能你想的是在另一线程中改变done的值来终止while循环,但是优化之后却无法做到这样.要避免这样的优化错误,就必须对done同步. //优化

Effective Java 阅读笔记——枚举和注解

30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 31:用实例域代替序数 应该给enum添加int域,而不是使用ordinal方法来导出与枚举关联的序数值.(几乎不应使用ordinal方法,除非在编写像EnumMap这样的基于枚举的通用数据结构) //WRONG public enum Fruit{ APPLE, PEAR, ORANGE; public int numberOfFruit(

iOS -- Effective Objective-C 阅读笔记 (7)

1: 实现 description 方法 NSlog 在输出自定义的类时, 只输出了 类名 和 对象的内存地址. 要想输出更为有用的信息也很简单, 只需要覆写 description 方法并将描述此对象的字符串 返回即可. - (NSString*)description{ return     xxxxxxx; } 有个简单的办法, 可以在 description 中输出很多互不相同的信息, 那就是借助 NSDictionary 类的 description 方法. - (NSString *

iOS -- Effective Objective-C 阅读笔记 (8)

若想令自己缩写的对象具有拷贝功能, 则需要实现 NSCopying 协议, 如果自定义的对象分为可变版本与不可变版本, 那么就要同时实现 NSCopying 协议和 NSMutableCopying 协议 复制对象是需要决定采用浅拷贝还是深拷贝, 一般情况下采用浅拷贝, 如果你所写的对象需要深拷贝, 那么就考虑新增一个专门执行深拷贝的方法.\ // 协议与分类 OC 语言有意向特性叫做 '协议', 它与 Java 的 '接口'类似, OC 不支持多重继承,因而我们吧某个类应该实现的一系列方法定义

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点