当前位置:网站首页>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
边栏推荐
猜你喜欢

Convolutional Neural Network (CNN) mnist Digit Recognition - Tensorflow

【Kaggle】House Prices

响应式织梦模板美容整形类网站

AQS原理和介绍

Based on FPGA in any number of bytes (single-byte or multibyte) serial port (UART) to send (including source engineering)

LTE time domain and frequency domain resources

Get started quickly with MongoDB
![[Personal work] Wireless network image transmission module](/img/64/c0cec74692df7ca05c1a5317e21c9d.png)
[Personal work] Wireless network image transmission module

虚拟机的IP地址自动变为127.0.0.1

STAHL触摸屏维修一体机显示屏ET-316-TX-TFT常见故障
随机推荐
myid file is missing
通俗解释:什么是临床预测模型
Interview assault 70: what is the glue bag and a bag?How to solve?
[译] 容器和 Kubernetes 中的退出码完整指南
2022年秋招,软件测试开发最全面试攻略,吃透16个技术栈
tiup mirror genkey
线上问题排查常用命令,总结太全了,建议收藏!!
图的邻接矩阵存储
系统收集集
Postman 批量测试接口详细教程
任务调度线程池基本介绍
如何封装 cookie/localStorage/sessionStorage hook?
tiup mirror merge
数据库单字段存储多个标签(位移操作)
MySQL 中出现的字符编码错误 Incorrect string value: ‘\x\x\x\x‘ for column ‘x‘
Interpretation of the meaning of each dimension of two-dimensional, three-dimensional, and four-dimensional matrices
MySQL Syntax Basics
Use WeChat official account to send information to designated WeChat users
【Dart】dart构造函数学习记录(含dart单例模式写法)
What is the difference between a utility model patent and an invention patent?Understand in seconds!