设计C++语言目标和原则说明
C++语言的一个目标就是提供更易用并具有一定承受能力的设计思想和程序设计技术,进一步提高程序的质量。这些技术中的绝大部分都源自Simula ,并通常被作为面向对象程序设计和面向对象设计思想来讨论。
论坛中,常有初学者问“学习C++语言之前是否有必要先学C?”。我认为这个问题是个伪问题。问题本身的答案并非是提出问题的人真正想要的。回答这个问题非常简单:“当然不需要”。因为C++是一门独立的编程语言,它在语法、构建环境和运行环境上都不需要依赖于任何其它语言。至于说它是“C语言的超集”。
那只是一种模糊的提法而已,更准确的说法应该是:C++语言从设计之初就充分考虑了对C语言的兼容性,结果使它在相当大的程度上兼容了C语言。如此而已。但对于那样提问的初学者来说,以上会是他们想要的答案吗?我觉得不是。至少问题没有这么简单。
C++语言支持多种编程范式:面向过程、面向对象和范型程序设计。它所兼容C的部分,也正是支持面向过程的主要部分。有C语言的基础,虽然有助于更快地掌握C++的面向过程部分,但由于C++语言本身也直接支持面向过程,因此我们完全可以从C++中直接学习面向过程程序设计,而无需先学C。至少理论上如此。
但话又要说回来。注意,提这个问题的大多是初学者。一般讲解C++语言的教程,限于篇幅,面向过程部分无法与一本优秀的C语言教程相媲美。于是,真正的问题来了:直接从C++语言开始学习的初学者,他是否愿意像C语言初学者那样花大量的时间和精力,专门钻研面向过程程序设计?
如果他不愿,那么他对面向过程部分的掌握,就难以跟一个扎扎实实学习过C语言的人相比。即使只讨论“C++中的C”,结论也是一样。但是,这里我只是想强调这样一个事实,而并非要下个“必需先学C”的结论。
我个人在初学C++语言时,觉得教程中学到的好多东西,包括面向对象程序设计,在实践中无法运用自如。后来因工作需要,又去学习Java语言,一下子就对面向对象有了一种开窍的感觉。再使用C++写程序时,发现OO起来也更顺畅了,我的好几位朋友也有过类似的感觉。究其原因,我想跟上面的分析的C语言的情况类似。C++的所支持的特性和编程范式更多,初学者很难快速消化全部。而Java在1.4之前,可以认为是纯面向对象的。
这样,使用Java写程序时,我们被迫实践面向对象编程,这就好比使用C写程序,我们被迫实践面向过程一样。而直接使用C++写程序,没有什么“被迫”,我们也就缺少了相应的“专项强化训练”。并非所有的人都需要这种“专项强化训练”,但对于初学者,面对着要掌握的复杂知识体系,它确实能起到“分而治之”的作用,从而促进对知识的消化和吸收。
还有人认为,学会了C++语言,自然就学会了C。而我认为这种观点是经不起推敲。我们必需承认两点:第一,C语言是有用的,这点不用多说,那么多C语言构筑起来的项目和复杂系统摆在那里。虽然它没有对包括面向对象在内的各种更抽象的编程范式提供直接支持,但事实早已证明它能解决复杂问题;第二,C++语言的设计者所设计的是一门新式的语言,而不仅仅是一个“更好用的C”。这就导致C++在继承C语言的同时也要对它的各种特性做必要的扬弃。
于是,就产生了很多这样的情况:某种特性,在C语言中非常重要,但C++语言却拥有一些新的特性来替代它,而且可能做得更好。这样,原来C语言中的一些特性在C++语言中虽然还被兼容,却被大大淡化,或不再提倡,甚至一些C++语言的教程中都不提那种特性。