分享嘉宾:高博/EMC前首席工程师
内容整理、编辑:博览网Boolan
以下内容精选自Boolan系列大咖直播:《一个牛逼C++程序员的编程素养》本文原创,转载请注明出处。
另外,高博老师作为“C++及系统软件技术大会”的讲师之一,也将在10月底和C++之父BjarneStroustrup、前Facebook研究科学家AndreiAlexandrescu、ISOC++标准委员会资深权威MikeSpertus等一起做出精彩分享。
C++大会完整PPT资料、及更多大咖直播在本文最末领取~
首先介绍一下我自己和这门课。我会对在博览网开设的这门课程《C++11/14最佳实践》做一个简介。然后开始今天的议题,它包括四个模块:
C++是怎么演化的,演化的基本规律
C++里哪些特性是被废弃的,以及为什么会被废弃
新的习惯用法和赏析
没有银弹(没有完美的解决办法)
最后一个是QA环节。
那么我们现在就开始。
我叫高博,英文名叫Daniel,原先是EMC的首席工程师,当然我已经离开了这家公司,开始自己的Business。
除了职业经历这一块,还有一个与众不同的业余爱好,就是做翻译。我最近出的一本书,叫做《C++覆辙录》,它可以说是C++98时代的教训总结吧,里面列举了99种常犯的一些错误。其他的一些我翻译过的,包括《编程格调》(TheElementsofProgrammingStyle),《研究之美》(SurrealNumbers)以及《信息简史》。你可以看到我是按照C++的相关度来排序的。(笑)
好,讲一下我在博览网开设的这门课的受众。
第一种呢,是之前掌握过一门编程语言,现在想转到C++。不管是从哪门语言转过来,只要你有一定的编程经验。
还有一种是,之前学过C++98,现在想转型到C++11/14,他可能会涉及到一些遗留代码的处理,自己写过的也好,看别人写过的也好。
当然如果没有任何编程基础的话,我们也非常欢迎,但是需要你非常认真地听课,有比较不错的悟性。如果说是直接跨越式地学习C++11/14,就把它当做你的第一门语言,并不是没有可能的,我之前也有过成功案例。
更何况C++之父BjarneStroustrup,我曾采访过他,学C++是否非要先从98学起,他的回答是非常斩钉截铁的,完全没有必要,C++是一门可以从任何版本(当然是C++的标准版本)开始学起,并且能够学得非常好的一门语言。
所以如果你完全没有一点基础的话,也是可以来听这门课,我觉得完全没有必要做这样的限制了。
前面我也有提到过,我在做翻译,我这门课程的基础,就是最近我在翻译的一本书,《EffectiveModernC++》。我看到有很多网友在问,什么时候能出版。因为实在比较忙,这本书一拖再拖,但是我会争取本月之内截稿,根据出版规律,一般会等两个月左右上市,也就是10月。
报名这门课程的同学,也就是有一个幸运的机会哈,能跟我一起,把这本书详细地看一遍。
这本书可以看作是,从作坊时代到工程时代的飞跃,它就是这么有影响力。大家如果学了这本书,一定会跟我一样,非常有收获。
好,闲话休提,我们开始来说一些干货。
C++是非常博大精深的二十四史,从何说起?那我这里,想先从一个小例子跟大家探讨一下,我在面试时也经常出这道题。
classStudent{char*name;intage;};
假如说我们现在有这么一个class,我想请大家用三分钟时间看看,能不能实现这个东西:
operator=它的赋值运算符
如果能够正确实现的话,是有一个小奖品的:)那么大家一边继续往下写,我继续往下讲。
我们可以看到,C++是一门非常复杂的语言,原来就有三种范式在工作:
面向过程,把C++当作更好的C编译器来使用;
基于对象,把数据表现成抽象数据结构;
继承抽象,把一部分class视作接口,把一部分实现放到passion类里面去。
然后在现代C++里,又多了一种,叫做函数式编程。函数甚至可以是匿名的,我们把它称作lamda表达式,它可以即时定义,即时执行。现在C++就有了四种编程范型,这四种又相互影响,让它变得更复杂。
但是所谓的C++,还是有一些核心价值观,我们可以从《C++的设计与演化》里看到一些。当然这里面也有一些过时的东西,仍然成立的,有这些:
C++实际上非常讲究抽象性,它不仅是可以对数据本身,对数据的实现有比较强的抽象,它对数据类型也会有一定的抽象。其他语言也有一些类似模板的东西。
你看在C++11里面,这个其实就引入了一种新的语义,叫做移动语义。你只需要把旧的搬到新的里面中去就行,它的代码就会变得非常简洁。
那么实际上,C++另外一个比较大的核心价值在于,它可以极其精确地分配内存和代码的执行,在冯诺依曼的体系结构里,所有的代码,不是数据就是执行。很多语言提供了高层的抽象,但是你没有办法知道它的底下是如何运作的。但是C++的话,如果你想,完全可以自己来实现。
当然,你也可以不去自己实现所有东西,而是理解所有东西,然后去用。这是一个更高的层次,我也会在自己的课程里反复强调,能不要自己做的事情,千万不要自己去做,你要去理解,不要去重新发明轮子。
C++第三个比较大的核心价值,你只为你用的东西付费。你没有必要去申请你不需要的资源。如果你不用的话,编译器不会为你生成一大段不用的代码。C++之父有一句著名的论断,GarbageCollection之所以高效运作,是因为它产生的垃圾代码很少。嗯,可能是最少的。(笑)
跨平台、跨编译器、跨操作系统、