01. More Effecitve C++ (译序,导读,基础议题)-- 学习笔记

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:指针与引用的区别

指针与引用都是让你间接引用其他对象。

在什么时候使用指针,什么时候使用引用?

  • 如果变量在某些时候可能不指向任何对象,应该把变量声明为指针,因为这样你可以赋空值给该变量。
  • 如果变量肯定指向一个对象,例如你的设计不允许变量为空,可以把变量声明为引用。

因为引用肯定会指向一个对象。

  • 引用指向空值,结果不确定。
  • 引用应被初始化。
  • 使用引用之前不需要测试它的合法性,使用引用的代码效率比使用指针的要高。

指针应该总是被测试,防止其为空。

指针可以被重新赋值以指向另一个不同的对象。
引用总是指向在初始化时被指定的对象,以后不能改变。

应该使用指针的情况:

  • 存在不指向任何对象的可能
  • 需要能够在不同的时刻指向不同的对象

使用引用的情况:

  • 总是指向一个对象并且一旦指向一个对象后就不会改变指向
  • 重载某个操作符并为防止不必要的语义误解时

除此之外的其他情况下,则应使用指针。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章