以文本方式查看主题

-  曙海教育集团论坛  (http://sun4.cn/bbs/index.asp)
--  C语言开发  (http://sun4.cn/bbs/list.asp?boardid=62)
----  关于C和C++区别的讨论  (http://sun4.cn/bbs/dispbbs.asp?boardid=62&id=2406)

--  作者:wangxinxin
--  发布时间:2010-12-10 11:20:17
--  关于C和C++区别的讨论
谈点我个人的看法哈,一家之言,欢迎拍砖。

    我个人理解,这二者其实没有太大差异性。

    C语言面向过程,OP,C++语言面向对象,OO.

    但实际上大家可能能关注到,不管如何OO,如何划分类和对象,但是,具体到一个功能,还是要用函数来实现,不管如何写程序,到了函数内部,其实还是那些if、for、while等等语句,还是面向过程的。

    所以,我和我的同事,平时并不会明显去分辨C和C++的异同,在我们看来,二者本来就是一体的。

    其实这个世界上,完全的OO是不存在的,当我们实现一个功能的时候,很多时候,就是界定一些数据,针对数据添加一些处理流程,获得一个结果,这件事情,本质上就是个过程。

    但C++还是很有用的。

    因为很多年以前,大家觉得传统面向过程的语言,如C,如Basic,如Pascal,都有一个缺点,就是在程序中,彼此暴露了太多的细节,这造成各个功能之间,由于程序员的失误,很容易发生粘连,联系。换而言之,就算是非法访问,通常也是合法而成功的,不会被编译器检查出来。比如C就允许全局变量和远指针调用。

    这在开发大型系统的时候,就出现了bug率居高不下,大型工程项目很难完成的缺点。

    正是因为此,大家在上世纪七十年代,提出了模块化开发的思想,试图通过各个模块的独立开发和运行,强行阻断各个模块不必要的耦合性,来达到让程序稳定的目的。

    但这样毕竟是人工在操作,是人做的,就可能会犯错误,大家觉得有必要在编译器这一级,要强调模块之间的独立性。

    这个时候,大家经过分析,发现程序其实核心是和数据打交道的,一个数据,业务上只要界定了用途,基本上,可能的访问方法就确定得差不多了,那么,我们有没有可能,把一类数据,以及其方法,从编译器的角度区别开来,构建独立模块,外部模块仅能访问到它允许访问的方法,其他的方法,全部报错,拒绝编译呢?

    答案是当然可以。大家就这么做了。那么,我们看看,一类数据和其允许的方法的集合,就是对象啦,在这个思想上,OO,面向对象的思想就产生了。

    最初,这个语言是一个新的语言,好像叫smalltalk吧,不过,这个时候的语言,还是实验室产品,没有投入商业运营。

    但这个时候,市场上,由于UNIX的推动,C语言基本上已经一统天下了。很多人都学的C语言,让大家去学习一门新语言,尤其是开发思路完全不同的语言,是不可想象的,成本太高。大家就想,能不能折中一下,以C的语法为蓝本,开发一套OO的语言,C++就这么诞生了。

    其实OP到OO,C到C++,本质上讲,就是一个数据私有化的过程。甚至整个语言的发展史,也是一个数据私有化的过程。如汇编语言,其实是没有私有数据的,所有的内存都可以被访问。

    人们通过编译器的界定和完善,逐渐实现数据私有化,最终的目标就是实现一个软件系统内部各个模块之间,高内聚,低耦合的目标,最终保证程序员的产品质量,进而提高生产率。

    至于后面的泛型编程,多态,继承等等,无非是在这条路上继续了一步而已,当然,也是为了尽量减少程序员的代码输入量,进一步提升生产效率而已。

    所以,从数据组织上讲,C++比C先进了一大步,但从功能实现上讲,C++和C并无本质不同。C++到现在,都不是一种完全的面向对象语言,因为它都仍然保留了全局变量。

    所以我的意见,两个一起学,不要刻意去区分,好像用C就要用纯C,没必要。

    我们工程中,系统级的模块组织,一般式C++的对象,每个单步功能,流程的实现,我们都是C的函数,仅仅是放在类里面而已