惯例与术语-新一代工业智能

时间:2024-06-27 19:35:48
【文件属性】:

文件名称:惯例与术语-新一代工业智能

文件大小:2.48MB

文件格式:PDF

更新时间:2024-06-27 19:35:48

More Effective C++ 高清 目录

2.2 惯例与术语 任何时候如果我谈到 inheritance(继承),我的意思是 public inheritance(见条款 E35)。如果我不是指 public inheritance,我会明白地指明。绘制继承体系图时,我对 base-derived 关系的描述方式,是从 derived classes 往 base classes 画箭头。 例如,下面是条款 31 的一张继承体系图: GameObject SpaceShip Asteroid SpaceStation 这样的表现方式和我在 Effective C++ 第一版(注意,不是第二版)所采用的习惯不 同。现在我决定使用这种 广被接受的继承箭头画法:从 derived classes 画往 base classes,而且我很高兴事情终能归於一统。此类示意图中,抽象类别(abstract classes, 例如上图的 GameObject)被我加上阴影而具象类别(concrete classes,例如上图的 SpaceShip)未加阴影。 Inheritance(继承机制)会引发「pointers(或 references)拥有两个不同型别」的 议题,两个型别分别是静态型别(static type)和动态型别(dynamic type)。Pointer 或 reference 的「静态型别」是指其宣告时的型别,「动态型别」则由它们实际所指的物件来 决定。下面是根据上图所写的一个例子: GameObject *pgo = // pgo 的静态型别是 GameObject*, new SpaceShip; // 动态型别是 SpaceShip* Asteroid *pa = new Asteroid; // pa 的静态型别是 Asteroid*, // 动态型别也是 Asteroid*。 pgo = pa; // pgo 的静态型别仍然(永远)是 GameObject*, // 至於其动态型别如今是 Asteroid*。 GameObject& rgo = *pa; // rgo 的静态型别是 GameObject, // 动态型别是 Asteroid。 这些例子也示范了我喜欢的一种命名方式。pgo 是一个 pointer-to-GameObject;pa 是一个 pointer-to-Asteroid;rgo 是一个 reference-to-GameObject。我常常以此方式来 为 pointer 和 reference 命名。 我很喜欢两个参数名称:lhs 和 rhs,它们分别是"left-hand side" 和"right-hand side" 的缩写。为了了解这些名称背後的基本原理,请考虑一个用来表示分数(rational numbers) 的 class: class Rational { ... }; 如果我想要一个用以比较两个 Rational objects 的函式,我可能会这样宣告: bool operator==(const Rational& lhs, const Rational& rhs); 这使我得以写出这样的码: Rational r1, r2; ... if (r1 == r2) ... 在呼叫 operator== 的过程中,r1 位於"==" 左侧,被系结於 lhs,r2 位於"=="右侧, 被系结於 rhs。 我使用的其他缩写名称还包括:ctor 代表"constructor",dtor 代表"destructor", RTTI 代表 C++ 对 runtime type identification 的支援(在此性质中,dynamic_cast 是 常被使用的一个零组件)。


网友评论