01. More Effecitve C++( 译序,导读,基础议题)
作者 : Scott Meyers
1. 译序
c++提供了四种不同(但相辅相成)的程式设计思维模式:procedural-based,object-based,object-oriented,generic paradigm。
动力是: 一旦学成,妙用无穷。
相关书籍
广博如四库全书者:The C++Programming Language、C++ Primer
深奥如重山覆水者:The Annotated C++ Reference Manual, Inside the C++ Object Model
细说历史者:The Design and Evolution of C++, Ruminations on C++
独沽一味者:Polymorphism in C++, Genericity in C++
独树一帜者:Design Patterns,Large Scale C++ Software Design, C++ FAQs
程式库大全:The C++ Standard Library
另辟蹊径者:Generic Programming and the STL
工程经验之累积:Effective C++, More Effective C++, Exceptional C++
2. 导读
涵盖 C 函式库
不必牺牲移植性
不必从头撰写常用演算法和资料结构
C++ 编译器的数量不断增加
C++ 开发工具和开发环境愈来愈丰富,威力愈来愈强大,稳健强固(robust)的程度愈来愈高。
本书回答的问题
- 我如何能够设计出适应未来需求的软体?
- 我如何能够改善程式码的效率而不折损正确性和易用性?
- 我如何能够实作出语言未能直接支援的精巧机能?
本书告诉你如何更具实效地设计并实作 C++ 软体:让它行为更正确;面对异常情况时
更稳健强固;更有效率;更具移植性;将语言特性发挥得更好;更优雅地调整适应;在「混
合语言」开发环境中运作更好;更容易被正确运用;更不容易被误用。简单地说就是如何让
软体更好。
大部份 C++ 教科书中对语言性质的大量描述,只能算是本书的一个背景资讯而已。
你应该在阅读本书之前便熟悉 C++。我假设你已了解类别
(classes)、保护层级(protection levels)、虚拟函式、非虚拟函式,我也假设你已通晓
templates 和 exceptions 背后的概念。
2.1 本书所谈的 C++
ISO/ANSI 标准委员会于 1997 年 11 月完成的 C++国际标准最后草案(Final Draft International Standard)。
2.2 惯例与术语
inheritance(继承),意思是 public inheritance
继承箭头画法:从 derived classes 画往 base classes,
抽象类别:abstract classes,
具象类别:concrete classes
Inheritance(继承机制)会引发「pointers(或 references)拥有两个不同类型」的
议题,两个型别分别是静态类型(static type)和动态类型(dynamic type)。Pointer 或
reference 的「静态类型」是指其声明时的类型,「动态类型」则由它们实际所指的物件来
决定。
一种命名方式为 pointer 和 reference 命名。
- pgo:pointer-to-GameObject;
- pa:pointer-to-Asteroid;
- rgo: reference-to-GameObject。
两个参数名称:
- lhs:“left-hand side”
- rhs:“right-hand side”
其他缩写:
ctor : “constructor”,
dtor : “destructor”
RTTI : C++ 对 runtime type identification 的支援
为了强调在 C++ 中 memory leaks 往往也会遗失其他资源,我在书中
常以 resource leaks 一词取代 memory leaks。
对象用完后一直未被释放时,对象所占的内存,以及构造对象时分配的其他资源
(如 file descriptors, semaphores, window handles,database locks),一起被遗失。
inline 函式:
- 决定一个函式是否应被 inlined,条件十分复杂、敏感、而且与平台有关。
- 避免 inlining,除非其中有个关键点非使用 inlining 不可。
client:指你所写的程式码的客户。
- 或许是某些人(程式员),
- 或许是某些物(classes 或 functions)
如何让 clients 更轻松,通常这会导至你的行事更困难,因为好的程序「以客为尊」。
3. 基础议题
- pointers(指针)
- references(引用)
- casts(类型转换)
- arrays(数组)
- constructors(构造)
3.1 Item M1:指针与引用的区别
指针与引用都是让你间接引用其他对象。
在什么时候使用指针,什么时候使用引用?
- 如果变量在某些时候可能不指向任何对象,应该把变量声明为指针,因为这样你可以赋空值给该变量。
- 如果变量肯定指向一个对象,例如你的设计不允许变量为空,可以把变量声明为引用。
因为引用肯定会指向一个对象。
- 引用指向空值,结果不确定。
- 引用应被初始化。
- 使用引用之前不需要测试它的合法性,使用引用的代码效率比使用指针的要高。
指针应该总是被测试,防止其为空。
指针可以被重新赋值以指向另一个不同的对象。
引用总是指向在初始化时被指定的对象,以后不能改变。
应该使用指针的情况:
- 存在不指向任何对象的可能
- 需要能够在不同的时刻指向不同的对象
使用引用的情况:
- 总是指向一个对象并且一旦指向一个对象后就不会改变指向
- 重载某个操作符并为防止不必要的语义误解时
除此之外的其他情况下,则应使用指针。