大年三十却不能回家,也不能找🐻玩,我恨死这个新型冠状病毒了
既然只能宅在家,那就充分利用一下这段时间多学习一点吧
言归正传,本章主要是在讲如何让自己适应C++,当然这也是全书所想要表达的,只是这一章着重讲一些基础
Item 1: View C++ as a federation of languages
特意去查了一下federation是什么意思,好像大概是说联盟、联邦之类的,所以这条item的意思其实是说,C++经过了长时间的发展,虽然最早是从“有对象的C语言”这一原型而来,但是现在已经是一门丰富而强大的语言,所以会包含很多种特性,开发者应当将C++看作几门子语言的集合。作者认为C++主要是以下四种子语言组成:
- C
- 面向对象的C++
- 模板类C++
- 标准库STL
这一点我确实是有所体会的,在工作时如果focus在用Qt开发各种UI,会觉得C++用起来还挺方便,看代码也没有特别难懂,都是一些业务代码,处理各种用户操作和设置样式等。往下看ViewModel的东西,就是一大堆数据结构和回调,如果再往下看一些service的代码,有时候就会碰到用C的风格写的一些底层的东西,看到一大堆下划线就会有点看不下去。还有一些通用的Util之类的会用到模板类,读起来也不太适应。
所以作者的建议就是根据不同的应用场景灵活切换使用策略,他举的例子也很好:我们都知道如果用内置类型作为参数(也就是C的风格),那么直接传递字面值会比传递引用要高效,但是如果用用户定义的对象作为参数(面向对象的C++),那么构造函数和析构函数的存在就意味着使用常值引用是更好的做法,这一点在模板类C++更是如此,因为你甚至无法提前知道传入的参数类型是什么。而当工作在STL时,由于迭代器和函数是用C的指针定义的,所以这个时候又应该沿用老的C风格的参数传递方式
总结:
C++的最佳实践规则会根据你使用的内容而变化
Item 2: Prefer const
s, enum
s, and inline
s to #define
s
这一条其实之前有了解过,但是只知道最好用const
替换#define
,也没有很深入的研究过为什么要这样做。作者是这样解释的:
这一条item其实也可以解释为prefer编译器而不是预处理器,因为声明为const
的变量会经过编译器的编译,而通过#define
定义的常量往往经过预编译后可能不会再经过编译,这就导致可能程序员在debug时根本无法知道某个出现的常量是在哪里定义的,怎么来的。所以最好的方法就是用const
替换#define
来定义常量,这里作者还给出了两个需要特别注意的地方
- 定义指针常量。因为常量的定义通常是写在头文件中,这样可以供很多的文件引用它,所以在头文件中将指针定义为常量是很重要的&