深入理解C++语言--从本质上理解C与C++
2012-02-17 01:47
141 查看
如果说任何事物都可以抽象为一种数据结构,这个数据结构肯定要有我们想操作的对象--该事物本身(它包括各种属性、要素),定义为数据;而这个事物本身(数据)肯定能进行各种各样的操作,如整数能+-*/%等,开关有开、关等操作,这各种各样的操作即为运算;既然是运算可定有运算规则,如浮点数就不能进行取余运算,开关不能吃等;总结起来:
![](http://hi.csdn.net/attachment/201202/16/0_1329413962c8oU.gif)
个人认为,C语言可以说是以数值型数据结构(如void,char,int,float)为基础,抽象出来的语言;它的任何操作都都被局限于数值型数据结构这一层面上了,即使有构造类型struct可以定义些复杂类型,但是它还是需要人工进行显式地赋值(详细见下面说明),可以说构造类型struct可以上C语言拥有面向对象的思想,但是实现不了真正的面向对象,同时也可以理解为什么被称为面向过程的了。因此可以看出C语言中各种操作都是围绕变量和函数,变量是如下类型的数值型数据结构,而函数是针对这些变量的数值型运算!
![](http://hi.csdn.net/attachment/201202/16/0_13294139856RsT.gif)
利用struct构造类型已经初步具有面向对象的思想了(如Linux内核完全使用C语言编写,但是使用了很多面向对象的思想),但是它仍然局限于数值型数据结构这一层面上,因为构造类型struct中成员函数不能直接定义,仍需利用指针,然后对于指针进行函数地址的赋值(数值的赋值),并且C定义的struct构造类型不能实现封装、隐藏,所有数据都是人工显式执行的,见下面实例分析。
例如,定义一个new_type的数据结构,包含了a,b两个操作数(数据),还有一个对于这两操作数的运算add。
class与struct之间的区别
![](http://hi.csdn.net/attachment/201202/16/0_13294140201R2m.gif)
![](http://hi.csdn.net/attachment/201202/16/0_1329414038wwWg.gif)
面向过程的C是基于数值型数据结构,即使有struct构造类型可以定义些复杂类型,但是它还是需要人工进行显式地赋值;而且它还要在其他函数中显式地调用,不能实现封装、隐藏。
而面向对象的C++则不同,它已经升华到基于非数值型数据结构(当然也包含数值型数据结构),class类,全部靠编译器实现相关联,封装,隐藏,和重定向。
![](http://hi.csdn.net/attachment/201202/16/0_1329414080l3Pq.gif)
C++则是在C基础上进一步抽象,升华到比C更高的一个层面,这样就不仅仅局限于数值型的数据结构了,通过类的定义把数据类型扩展到非数值型的数据;
而运算符的重载则可以重新定义数值型运算(+-*/%等)对应于非数值数据的运算(如+-*/%等可以重定向为某一具体的操作)。
C++类的对象不仅仅是一般意义上的变量了,它的内部能够进行自己的操作、运算,而对外却是黑盒,只是保留一个接口留给用户。
![](http://hi.csdn.net/attachment/201202/16/0_132941410525E2.gif)
总之,C++已经从C完完全全地实现质的升华,从C的数值型数据结构升华到C++的非数值型数据结构,从C的数值型运算(+-*/%等)升华到C++的非数值型运算(如+-*/%等可以重定向为某一具体的操作),这个进步不是一般的大,而这些工作全都交由编译器完成了。
原创作品,转载请注明原作者及地址!
by 飞鸿惊雪
![](http://hi.csdn.net/attachment/201202/16/0_1329413962c8oU.gif)
个人认为,C语言可以说是以数值型数据结构(如void,char,int,float)为基础,抽象出来的语言;它的任何操作都都被局限于数值型数据结构这一层面上了,即使有构造类型struct可以定义些复杂类型,但是它还是需要人工进行显式地赋值(详细见下面说明),可以说构造类型struct可以上C语言拥有面向对象的思想,但是实现不了真正的面向对象,同时也可以理解为什么被称为面向过程的了。因此可以看出C语言中各种操作都是围绕变量和函数,变量是如下类型的数值型数据结构,而函数是针对这些变量的数值型运算!
![](http://hi.csdn.net/attachment/201202/16/0_13294139856RsT.gif)
利用struct构造类型已经初步具有面向对象的思想了(如Linux内核完全使用C语言编写,但是使用了很多面向对象的思想),但是它仍然局限于数值型数据结构这一层面上,因为构造类型struct中成员函数不能直接定义,仍需利用指针,然后对于指针进行函数地址的赋值(数值的赋值),并且C定义的struct构造类型不能实现封装、隐藏,所有数据都是人工显式执行的,见下面实例分析。
例如,定义一个new_type的数据结构,包含了a,b两个操作数(数据),还有一个对于这两操作数的运算add。
struct new_type{ int a; int b; int (*add)(int a, int b); }; int f_add(int a, intb) { return a+b; } struct new_type test; test.add=f_add; //1。可以看出是基于数值型数据结构层面的赋值 test->add(test.a, test.b); //2。所有数据都是显式地调用执行的见上,即使有struct构造类型可以定义些复杂类型,但是它还是需要人工进行显式地赋值(如1);而且它还要在其他函数中显式地调用,不能实现封装、隐藏(如2)。
class与struct之间的区别
![](http://hi.csdn.net/attachment/201202/16/0_13294140201R2m.gif)
![](http://hi.csdn.net/attachment/201202/16/0_1329414038wwWg.gif)
面向过程的C是基于数值型数据结构,即使有struct构造类型可以定义些复杂类型,但是它还是需要人工进行显式地赋值;而且它还要在其他函数中显式地调用,不能实现封装、隐藏。
而面向对象的C++则不同,它已经升华到基于非数值型数据结构(当然也包含数值型数据结构),class类,全部靠编译器实现相关联,封装,隐藏,和重定向。
![](http://hi.csdn.net/attachment/201202/16/0_1329414080l3Pq.gif)
C++则是在C基础上进一步抽象,升华到比C更高的一个层面,这样就不仅仅局限于数值型的数据结构了,通过类的定义把数据类型扩展到非数值型的数据;
而运算符的重载则可以重新定义数值型运算(+-*/%等)对应于非数值数据的运算(如+-*/%等可以重定向为某一具体的操作)。
C++类的对象不仅仅是一般意义上的变量了,它的内部能够进行自己的操作、运算,而对外却是黑盒,只是保留一个接口留给用户。
![](http://hi.csdn.net/attachment/201202/16/0_132941410525E2.gif)
总之,C++已经从C完完全全地实现质的升华,从C的数值型数据结构升华到C++的非数值型数据结构,从C的数值型运算(+-*/%等)升华到C++的非数值型运算(如+-*/%等可以重定向为某一具体的操作),这个进步不是一般的大,而这些工作全都交由编译器完成了。
原创作品,转载请注明原作者及地址!
by 飞鸿惊雪
相关文章推荐
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
- 深入理解C++中的mutable关键字 http://no001.blog.51cto.com/1142339/389840/
- 深入理解C++中public、protected及private用法
- 深入理解C/C++ [Deep C (and C++)]
- Protocol Buffer技术深入理解(C++实例)
- 深入理解C++的动态绑定和静态绑定
- C++中引用和匿名对象的理解和本质剖析
- 深入理解C++中的mutable关键字
- 深入理解C++的new
- 深入理解C++的动态绑定和静态绑定
- 深入理解 C++ 指针(四)---指针表达式
- 深入理解 C++ 指针(十)---指针与链表问题
- NS2笔记 之 OTcl与C++ (分裂对象模型的深入理解)
- C字符串与C++字符串的深入理解
- [深入理解C++(一)]类型转换(Type Casting)
- [深入理解C++(二)]理解接口继承规则
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
- 深入理解C++的动态绑定和静态绑定