最近一直在聊C++的基础教程,为了稍稍平衡,我专门开了一个专栏,聊聊这本《Effective C++》,程序员的第二本书,它没有人们口中的那么神话,但依然能让刚刚深入学习的我们受益匪浅
全书由55个条款构成,使得这本书简洁且实用,为了不破坏这种阅读体验,我们延用此书的条款
条款01:视C++为一个语言联邦
C++最初以C语言的plus版出现的,而时过境迁,这种说法早已过时,现在C++内容规范多如牛毛,就连C++专家都不一定能用好C++,所以对于C++新手来说,正确把握自己正学习哪一个部分十分重要,对于C++来说,其实大致分为四个大块
·C C++中的C基础语法
·object -oriented C++ C++中对于对象的支持,比如结构,封装,继承
·template C++的泛型编程,这是大部分人接触最少的地方,是C++非常有力的工具
·STL 最不属于C++基础学习的地方,以内容繁多,规则错综复杂著称,但一些基本库还是需要加以了解,比如Vector,Cstring
这四个板块共同构成了C++,但他们之间的联系并没有我们想象的那么紧密,这四者之间语言规范并不完全一致,有时甚至会完全相反,特别是pass by value和pass by reference之分,常常让初学者晕头转向
所以,应当把C++视为一个松散的语言联邦,除了一些基本基础的语法规则,每一个板块还有自己独特的规则,编写程序时,要仔细分辨自己所写究竟位于哪一个板块,从而规避不必要的错误,让自己的注意力放在程序本身
条款02:尽量以const,enum,inline替换#define
原因?
预处理语句是C++继承C的遗产,在最初的编程发展历程,程序员缺乏表示常量的方式,所以程序员倾向使用宏来表示常量,这是就需要用到预处理
预处理器是如何工作的呢?平心而论,预处理并不是语言的一部分,甚至不能算是编译器的一部分,它们在编译器之前就对源代码做了一定的处理
·#define<name> #define的工作方式非常粗暴简单,比如这句 #define HIGH 1.234,预处理器会将所有HIGH全部替换成1.234
·#include<name> #include的工作方式也同样直接,比如这句 #include <cstring.h>,预处理器会直接将目标文件完全复制进源文件
这里选择两条重要预处理命令加以介绍,其余的,请看这里,不再过多赘述C的预处理器
https://www.runoob.com/cprogramming/c-preprocessors.html 回到上述的介绍,所以对于编译器来说,HIGH根本就没有出现过,有的仅仅只是1.234而已,所以当我们对程序反编译时,变量表中只会出现1.234这数字,而不是HIGH,因此,当编译器报错时,编译器只可能指向1.234这个数字,而非HIGH,糟糕的是,很多时候,我们并不清楚1.234指的是什么,这恰恰是我们需要规避define的原因,方便我们对程序进行调试,以免让一些奇怪的问题制约我们编程真正的目的——让现实的问题简洁化,程式化,抽象化,让计算机得以参加问题的解决
需要注意的
用const代替define表示常量,大部分情况毫无问题,但依然有着两点需要加以注意
1.常量指针
const char* const name = "Mike"; 不只是指针本身是常量,指针指向也必须得是常量
2.class内的常量
class GM
{
private:
const int a1 = 1;//False
const int a2;//True
static const int a3 = 5;//True
}; 需要知道,class声明时不可以出现对于变量的定义式,除了static整数型常量,正如上例,如果别人的代码出现如下情况
class name
{
enum {a = 5};
int scores[a];
}; 需要知道这是合法的,而且来源于C++的一条规则“一个枚举整型量是可以当作ints来使用”
尾声
这一篇文章是《Effective C++》专栏的第一篇文章,这个专栏以后会持续不断地为大家献上优质的解说!
当然,本文只是依据自身经验,对原文内容进行适量的补充和缩减,依然支持大家读读原书,同样大有裨益!

京公网安备 11010502036488号