[Effective C++]解读2021/11/12

最初解读这本书的原因一是为了让自己在解读的过程中有更好的理解和记忆,二是希望给更过渡过基础期后处于方向迷茫的同学指出一些方向,这系列的书被称为C++工程师必读的圣经,那么从中找到属于自己的方向,是一件最好不过的事情。我会摘抄或者省略我认为书中十分重要或不重要的内容,并按照我的理解加以诠释,如果我的理解有偏差,欢迎指出我会及时修正。

一·C++是一个语言联邦

        我遇到过很多人(包括我),他们在接触C++后单纯的将其看作是一门单独的语言,其实在我看来,C++从诞生初始,就是继承了C语言大部分的特性并添加了一些面向对象的特性,正如C++最初的名字C with Classes(C语言加上一些‘类’)。

        这里简单解释一下面向对象和面向过程,这两者之间的差别是很多大学生在刚上接触C或java时,老师讲他们差别时说的最多的两个词。但对于全栈的初学者来讲,任何比喻都会让人云里雾里,拿捏不到其中的痛点。

        面向过程。C语言可以说是最纯正的面向过程的语言,在用C语言开发嵌入式的工程时给人的感受尤为突出(如车载系统)。C语言为何被广泛用于嵌入式这里不做赘述。很多接触过相关项目的同学应该会有较为突出的感受,那就是在查看其代码时,每一个主题的.c的文件都会附带3-5个.h的头文件为其服务。而.c文件作为执行文件,其中的代码逻辑多用调用.h文件中的函数来实现。以至于单独看到一个.c文件,哪怕每一行都有注释,也很难摸索出其中的逻辑。而这正是面向过程的C语言所附带的‘并发症’。面向过程正如其字面意思,从解决问题的过程开始入手并着重处理,所以当你想要达成一个功能(解决一个问题),你首先有的面向过程思想应该是刨析出要解决这个问题,你需要将它拆分成哪些个小问题并逐个写出他们的‘解决方案’,而这些解决方案,大多被写在附带的.h头文件中,然后在.c的执行文件中再基于这些小方案规划出解决最终问题的大方案,并通过逻辑代码和调用头文件的函数以实现功能。这就是面向过程,而基于以上我可以给出这样的比喻,也更便于同学理解,当唐僧想去取经,这是一个大问题,而取经一路上会有许多小妖精,这是小问题,而唐僧招揽的三个徒弟和一匹马,就是他为了解决这些小问题所提出的小方案,当唐僧安排他的徒弟和马一路过关闯将来到西天取得真经,也就是解决了大问题,而这就是面向过程解决方案。

        面向对象,如同Java、C++,他们的思想就是,万物皆是对象,而这种思想,以‘类class'这种东西最见长,面向对象的思想并不重视过程,也就是说,唐僧并不在意是谁帮他解决了取经路上的麻烦,他可以选择喊观音菩萨下凡,也可以让悟空亲自去打怪,至于怎么打,这不是唐僧需要做出安排的。就如你在使用Java编程时,突然遇到了一个功能需要用到很多小方法(函数)去解决,但是你并不需要亲自去写类似头文件一样的东西,你只需要import.一个技术库,并对库中内容加以继承,就会让你的对象成为你需要的样子。(我想这也是嵌入式主要用C语言的一个原因,在非常有限的硬件条件下,无法做到内含大量的库,所以除了几个基础的标准库,其他都需要开发者自行编写。)面向对象的三个伟大的特点:封装、继承、多态。封装顾名思义,它将实现功能的过程封装起来,让使用它的人不需要知道它是怎么写出来的,只需要你在用得到时,喊他出来帮你平事就可以。继承依然顾名思义,将一个父类写出来的方法继承给一个子类,让他的子类用继承过来的方法(工具)去继续完成自己的功能。而多态较为复杂,他的用法类似于C语言中的结构体。

        例如:

        Person a = new Worker();

        a.lunch(); // 调用的是 Worker 的 lunch

        Worker c = (Worker)a;

        c.work(); // 调用的是 Worker 的 work

先大概对多态的功能有个了解,在后续的内容和代码会逐步深入探索这一特征,当然你也可以背下这句标准答案,因为在面试时你很有可能遇到‘什么是多态’这样的问题——父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。

        书归正传,为何视C++为一个语言联邦。今天的C++已不容往日,它成为了一个多重泛型编程语言,它同时支持面向过程(继承自C语言),也支持面向对象,同时还包括函数(方法)形式、泛型形式(算法实现时不指定具体要操作的数据的类型;泛型->Rightarrow⇒ 算法实现一遍 ->\Rightarrow⇒ 适用于多种数据结构;减少重复代码的编写大量编写模板,使用模板的程序设计)、元编程形式(是C++中最复杂也是威力最强大的编程范式,它是一种可以创建和操纵程序的程序。 模版元编程完全不同于普通的运行期程序,它很独特,因为模版元程序的执行完全是在编译期,并且模版元程序操纵的数据不能是运行时变量,只能是编译期常量,不可修改,另外它用到的语法元素也是相当有限,不能使用运行期的一些语法,比如if-else,for等语句都不能用。 因此,模版元编程需要很多技巧,常常需要类型重定义、枚举常量、继承、模板偏特化等方法来配合,因此编写模版元编程比较复杂也比较困难。)。对于以上列举的一些特性,目前并不需要有太深入的理解,只需要大概知道他们是做什么的,具体的实现也会随着书本越翻越多而逐渐掌握。

        C++之所以称之为语言联邦,就是因为他并不只包含唯一一组守则的一体语言,他是由4个次语言组成的联邦政府,每个次语言的规约它都适用。C++的守则应由开发者视情况而变化,主要去取决于开发者使用的是C++中的哪一部分。

        C++的语言特点依然还有很多,不能逐一阐述,不过在日后的诠释中,会逐步提及并加以讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值