ygreatred 2018-09-05
其实作为计算机系本科生来说,在大学阶段接触最多的就是C语言和C++了。C语句是面向结构的语言,C++是面向对象的语言,C++从根本上已经发生质飞跃,并对C进行丰富的扩展。C是C++的子集,所以大部C语言程序都可以不加修改的拿到c++下使用。那么这两者究竟有哪些区别呢,今天小编就跟大家详细探讨一下:
C语言编译器内部相比于简单的汇编翻译器,自然要做更多的事情。但是它的内核还是很机械,很无趣,不做哪怕一点点多余的事情,相比于汇编语言,不过就是可以表达的粒度大了一点点,一点都不智能。不智能的意思是,它没有函数重载,没有函数重写,数据类型所蕴含的无穷潜力,在C这里仅仅用于定义内存布局,简单的类型检查。
由于缺乏高级的抽象机制,用C语言实在没办法搞应用框架这种高大上的玩意,实在是语法很不友好,抽象粒度太细,抽象手段太单一。C语言这种语法简单内涵单薄的猿语,只有lognjmp和达夫设备还算有点点小惊喜,要精通还不是就手到擒来,再容易不过。
表面上看,C++不过是比C多了很多语法糖,当然,每一条语法糖,都代表一种新的抽象手法,表示写优雅的代码又多了一种选择。
比如说,析构函数,用以当对象的生命周期结束时将被调用。析构函数的调用时间与函数调用的即时调用就很不一样,应该可以感受出来这种时间差异区别的明显。C语言中没有任何办法做析构函数这样延后执行的手段,除了手工显式的在作用域结束之前调用函数,就别无他法了。而大C++就大不一样,只要对象存在析构函数,只要定义对象变量,只要变量要死了,其析构函数就被调用。而且,当有多个不同类型变量聚在一起,各自都有析构函数,编译器就会很体贴的按照栈式顺序执行这些对象的析构函数,这些函数调用的动作,从代码字面上看不出来,但是C++的语义就规定了这样一系列的动作必须发生。而C语言的话,就要求程序员明确地调用这些析构函数,而且栈式顺序也续保持一致。
又比如说,虚函数,虚函数表,就可以将多个不同的函数打包在一起,这样子,在模板方法中的几个关键点上,同样的虚函数名称调用下,子类就各自做不同的动作系列。当然,虚函数不仅仅用于模板方法。虚函数相比于函数调用,又是全新的抽象手段。对于面向对象语言来说很自然的语法,C语法要费老大劲才能达到同样的效果,定义虚函数表结构,创建虚函数表变量,初始化虚函数表内容,每次创建对象时,设置正确的虚函数表指针。然后,调用虚函数时,还要通过索引找到虚函数指针,再将对象地址还有其他参数传递给虚函数。鉴于虚函数的使用,对于C语言来说,这么麻烦,程序员一般都不会在代码中轻易使用。程序员每次使用虚函数,C++编译器就暗地里要做这么多的事情。而程序字面上,代码上的虚函数调用也不再能够明确指明其调用的具体是哪一个函数。
C++的构造函数、函数重载、操作符重载、隐式类型转换、异常等等,那个不是为了让编译器多做一点事情,自动化产生代码。如果你承认机器的自动化生产代码就是好,就是妙,更何况这种自动化生产代码行为,全在程序员的掌控之中。那应该可以欣然接受C++要比C不要好太多的结论。但是,具体到代码的二进制复用以及内存布局上,却一塌糊涂,特别是多继承,孰优孰劣,有点不好取舍了。
C入门不难,精通可能也不难,但是想精通C++,就是非常非常非常难!能用到什么程度,就表明对它掌握程度。甚至可以做到随意切换。用的多了,你甚至会认为这俩根本就不是同一门语言,又可以是同一门语言!就是那样一种境界!所以真正的区别的回答肯定会因人而异,可能就是取决于使用的人有几斤几两的区别了。
继承对象模型在 C++ 编译器的内部类可以理解为结构体子类是由父类成员叠加子类新成员得到的class Dervied : public Demo. << "mk = " << mk << endl;c