当前位置:网站首页>C陷阱与缺陷 附录B Koenig和Moo夫妇访谈
C陷阱与缺陷 附录B Koenig和Moo夫妇访谈
2022-08-01 21:00:00 【weixin_客子光阴】
Alex Stepanov 惠普实验室工作 正在开发的一个C++库
向标准委员会提交STL,并建议将其并入标准库。
就其本身而言,C++是一种非常低级的语言,唯有利用库才能写出高层次的程序来。初学者还不能自己构造库,所以他们要么用现成的标准库,要么自己去写低层次的程序。确实有不少程序应该用低层次技术来构造,但是对于初学者不合适。
当然是库由于语言细节,这里有两个原因:首先,学生可以不必费力包装低层次的语言细节,从而更容易建立整体语言的全局观念 ,了解到其真实威力。学生在掌握如实使用程序库之后,就会很容易理解类的概念,学会如何构造类的技术。
更重要的一点是,首先学习程序库,能够使学生培养良好的习惯,就是复用库代码,而不是凡事自己动手。首先学习语言细节的学生,最后的编程风格往往是C类型的,而不是C++风格。它们不会充分地运用库,而自己的程序带有严重的C主意倾向---指针满天飞,整个程序都是低层次的。结果是,在很多情况下,你为C++的复杂性付出了高昂的代价,却没有从中获得任何好处。
《C++沉思录》提到:“C++希望面对把实用型放在首位的社群”
“糟糕的手艺人常常责怪自己的工具?”
“当你手里拿着锤子的时候,整个世界都成了钉子。”
如果你选择了这样的工具,那么你就必须负责选择合适的设计方案。
C++在运行时性能上做了一个很好的折中,能够在“一切都是对象”的语言与“避免任何抽象”的语言之间取得恰到好处的平衡。这就是C++的实用型。
“基于对象”和“基于模板”的抽象机制优先于面向对象抽象机制
所谓面向对象编程,就是使用继承和动态绑定机制编程。在我们看来,这意味着该程序有两个或两个以上的类型,至少有一个共同的操作,也至少有一个不同的操作。否则,就不需要继承机制。此外,程序中必然有一个场景,需要在运行时从这些类型中挑选出一个,否则就不需要动态绑定机制。
某些面向对象编程语言,如Python,其所有类型都是动态的,那么技术图书的作者就不会面对这样的问题。例如,C++中的容器类大多数用模板写成,因其可以容纳毫无共同之处的对象,所以要求元素类型必须是某个共同基类的派生类毫无道理。然而,在Python中,容器类中本来就可以放置任何对象,所以类似模板那样的类型机制就不必要了。
所以,我认为你所看到的问题,其实是因为很难找到又小又好的面向对象程序来做范例,才会产生的。而且,对于其他语言必须烦劳动态类型才能解决的问题,C++能够使用模板来高效地解决。
除非你首先掌握了构造良好类的技术,否则急急忙忙去研究继承就是揠苗助长。
《C++沉思录》“用类表示概念”假设我能再记住一句话,你们觉得应该是什么?
“避免重复”如果你发现自己的程序的不同部分中做了相同的事情,则试着把这两个部分合并到一个子过程中。如果你发现两个类的行为相近,则试着把这两个类的相似部分统一到基类或模板中。
《C++沉思录》中有两句名言:“类设计就是语言设计,语言设计就是类设计”
Python和C++程序构成了完美的一对组合。Python程序比相应的C++程序短小精悍,而C++程序则比Python运行程序快得多。因此,我们可以用C++来构造那些对性能要求很高的部分,然后用Python把它们粘在一起。Boost中的一个作者Dave Abrahams写了一个很不错的C++库,很好地处理了C++与Python的接口问题。
我们应该保持谦虚。
成为更好的C++程序员。请给我们3个你们认为最重要的建议:
1.避免使用指针
2.提倡使用程序库
3.使用类来表示概念
其他著作:
Ruminations on C++
中文班序
本书内容:
C语言编程中一些重要的经验教训。
学习方式:
1、要成为一个优秀的程序员,最重要的无非是学习一种特定程序语言、函数库或者操作系统的细节,而且多多益善。
2、需要一本索引丰富完备的参考书就已经足矣;
3、最多可能还需要一位稍有经验的同事不时从旁点拨,指明方向;
学习难点:
难的是那些我们已经了解的东西,如何“运用之妙,存乎一心”。
掌握学习难点的方法:
1、学习那些是不应该做的;
2、研究一种语言中程序员容易犯错之处;
学习方式:
对一般人而言,最有效的学习方法是从感性的、活生生的事例中学习,
比如自己的亲身经历或者他人的经验教训。
书籍推荐:
C语言编程:kernighan和Ritchie:The Programming Language,第2版,Prentice-Hall, 1988
C语言参考手册:Harbison和Steele: C:A Reference Manual,第2版,Prentice-Hall,1987
数据结构和算法: Van Wyk: Data Structures And C Programs,Addison-Wesley,1988
可移植性:Horton: How To Write Protable Program In C,Prentice-Hall,1989
操作系统接口:Kernighan和Pike: The Unix Programming Environment,Prentice-Hall,1984
绞尽脑汁的C语言难题:Feuer: The Puzzle Book,Prentice-Hall,1982
边栏推荐
- StringTable Detailed String Pool Performance Tuning String Concatenation
- Redis does web page UV statistics
- Pytorch框架学习记录10——线性层
- 外骨骼机器人(七):标准步态数据库
- 使用百度EasyDL实现厂区工人抽烟行为识别
- Nacos 配置中心
- STAHL touch screen repair all-in-one display screen ET-316-TX-TFT common faults
- Simple test of the use of iptables
- Different operating with different locks, rounding
- Hiking, cured my mental internal friction
猜你喜欢
[Energy Conservation Institute] Comparative analysis of smart small busbar and column head cabinet solutions in data room
Qt设置应用程序开机自启 解决设置失败原因
Buttons with good user experience should not have hover state on mobile phones
Convolutional Neural Network (CNN) mnist Digit Recognition - Tensorflow
关于Request复用的那点破事儿。研究明白了,给你汇报一下。
excel高级绘图技巧100讲(二十二)-如何对不规则数据进行分列
面试突击70:什么是粘包和半包?怎么解决?
仿牛客论坛项目
数据库内核面试中我不会的问题(1)
用户身份标识与账号体系实践
随机推荐
面试官:大量请求 Redis 不存在的数据,从而打倒数据库,有什么方案?
Application of Acrel-5010 online monitoring system for key energy consumption unit energy consumption in Hunan Sanli Group
Different operating with different locks, rounding
The Internet giant development process
密码学的基础:X.690和对应的BER CER DER编码
R语言 线性回归的有关方法
数据库内核面试中我不会的问题(1)
R语言 数据的关系探索
【Dart】dart之mixin探究
技能大赛训练:A部分加固题目
微信小程序云开发|个人博客小程序
任务调度线程池-应用定时任务
系统收集集
PyTorch笔记 - Attention Is All You Need (2)
关于Request复用的那点破事儿。研究明白了,给你汇报一下。
R语言 pca主成分分析的主要方法
latex paper artifact -- server deployment overleaf
Go Atomic
那些关于DOM的常见Hook封装(二)
Telnet弱口令渗透测试