《随笔二十六》—— “ 【More Effective C++】 提炼总结一 ”

本文介绍了《More Effective C++》中的基础议题,包括指针与引用的区别、C++风格的类型转换、避免多种形式对待数组以及何时提供默认构造函数。指针与引用在初始化、重新赋值、安全性等方面有显著差异,指针更灵活但存在安全风险,引用更安全但不可重新绑定。建议尽量使用C++风格的类型转换,避免将数组以多态方式处理,并根据需求谨慎提供默认构造函数。
摘要由CSDN通过智能技术生成

 

目录

惯例与术语

第一章  基础议题

Item M1:指针与引用的区别

Item M2:尽量使用C++风格的类型转换

Item M3:Never treat arrays polymorphically. (永远不要用多种形式对待数组。)

Item M4: 非必要不提供 default constructor


本人在2019 年看此书, 建议大家看此书的时候,可以下载其英文版。 当看不懂的时候可以翻译相应的英文部分。 那么我在总结每个条款的时候, 不仅总结了我认为重要的知识点, 还总结了其他书籍相应的知识点,比如说C++ Pimer 第五版 。 当你看到总结了本书中没有的内容时,你也不并惊讶。

说明:More Effective C++ 这本书在网络上的pdf 都是叫 刘晓伟的人翻译的, 并没有 侯捷 翻译的pdf 版本。  如果想看侯捷翻译的版本可能需要购买纸书。 我本人就是买了 侯捷翻译的 纸书, 跟网络上翻译的pdf 版本的翻译风格完全不同。


惯例与术语


在本书中作者如果提到 inheritance(继承),意思指的是 public inheritance(见条款E35)。如果作者不是指 public inheritance,他会明确的指出。在绘制继承层次结构时,通过绘制从派生类到基类的箭头来描述派生类到基类的关系,例如下图:

在上图中,抽象类 GameObject 被阴影部分覆盖,而 三个 派生类 未被阴影覆盖。

 

继承机制会产生两种不同类型的指针和引用,静态类型和动态类型。指针或引用的静态类型是其声明的对象的类型。动态类型由它实际引用的对象类型决定。下面是根据上图所写的示例:

GameObject *pgo = new SpaceShip; // pgo 的静态型别是 GameObject*,动态型别是 SpaceShip*
Asteroid *pa = new Asteroid; // pa 的静态型别是 Asteroid*,动态型别也是 Asteroid*。

pgo = pa; // pgo的静态类型仍然是GameObject*。它的动态类型现在是Asteroid* 

GameObject &rgo = *pa; // rgo 的静态型别是 GameObject, 动态型别是 Asteroid。

这些示例演示了作者的命名约定。 pgo是一个指向 GameObject的指针; pa是指向 Asteroid 的指针; rgo是对GameObject的引用。 作者经常以这种方式编写指针和引用名称。 我理解的意思是:比如说 pgo,指针的单词是pointer,p就是pointer首字母,g代表的是Game的首字母, o代表的是Object 的首字母,pa 和 rgo 的意思都一样。 其实就是一种命名方法, 忘了叫什么了。

 

作者还使用缩写,比如:ctor表示 “ 构造函数 ”,dtor表示“析构函数”,RTTI表示c++对运行时类型标识的支持(其中dynamic_cast是最常用的, 还有一个是 typeid 运算符, 它们两在 C++ Primer 第五版的 第730 页有介绍)。

在本书中作者为了强调在 C++ 中 memory leaks 往往也会泄漏其他内存资源,在书中 常以 resource leaks 一词代替 memory leaks。

作者在本书中还告诉我们哪些特性已经被抛弃, 哪些特性可以取代之。还建议我们尽量用新特性,避免使用已经被抛弃的特性。

client 指的 是某人(程序员)或使用您编写的代码的某种东西(通常是类或函数)。

 

还有一个关于 class template 或 function templates 的惯例, 直接举书上的例子:如果Array是一个带有类型参数T的类模板,可能会以 Array 代表此 template 的某个特定实例化(instantiation),即使 Array<T>实际上是类的名称。类似地,如果swap是一个带有类型参数T的函数模板,我可能会以 swap 而非 swap<T> 表示其实例化。在这种简写可能不清楚的情况下,我在引用模板实例时包含模板参数。

我写的也不好, 你看不懂的话。 可能有必要学习模板的基础知识。 不过这个在这里也不重要。

 


第一章  基础议题



Item M1:指针与引用的区别


指针和引用看上去完全不同,但是它们做的事情非常的相似。 下面先说下引用和指针的区别:
 

  • 首先引用必须被初始化(就是必须指向某个特定的对象), 没有所谓的空引用 (意思就是该引用没有指向任何一个对象)。 但是指针可以不需要初始化 (如果没有初始化,在块作用域内定义的指针的值将是一个不确定的值, 如果是在任何块作用域之外,那么该指针初始化为 空),但是最好初始化,当某个指针不知道指向哪个对象时, 根据 C++11 标准,一般使用 nullptr 初始化。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值