注册 登录
编程论坛 C++ Builder

类的实质思考

枯藤天涯 发布于 2008-12-10 21:19, 5477 次点击
类的实质思考
枯藤天涯原创
首发于编程论坛



面向对象编程,到底什么是面向对象?面向对象程序设计到底有什么强大的力量?
面向对象编程和面向过程编程到底的区别是什么?
如何解释类,对象,继承,封装这些概念?
一段思考后,有了下面的理解。抛砖引玉!以期引发讨论。
从C中的一段代码开始:
int i;
i=34;
该代码简单不过,但是它与类的概念却又相同的地方。
我们声明了一个变量i,然后对其给予一个值。
但是这句代码的实质是什么?
该代码会被我们的编译器编译:
或许是内存中的两个字节,然后被这两个字节的位信息初始化为34对应的二进制串。

然而这与类有什么关系呢?
类就是我们自己定义的一个变量类型,但是对 该变量类型定义的变量 的操作不是由编译器完成的,
而是由我们设计程序来完成的。
请仔细的理解上面的话。
下面我解释下。
我们定义一个类。我们一定会在类中安排下数据成员,方法成员。直接的讲,数据成员就是些基本的数据,方法成员
就是我们定义的一些函数。

类就是像int这样的变量类型声明。为什么?
在上面,我们使用int声明了一个i变量,我们可以对其进行+,_,*,/运算。为什么?
这是因为编译器会理解我们给出的语法。也就是对这个i的操作函数实际是由编译器来帮助我们完成的。
我们自己定义了一个新的类。如果我们不在其中加入操作函数。该类的创建于建立一个结构体没有区别。
但是如果我们还在类中添加了针对这个类型的方法函数。也就是相当于我们扩展了编译器的功能。此时编译器
对我们自己新建的变量类型也可以支持。以后,如果我们再使用相同的类,它就会理解。

同时还有下面的相同的地方:
对于int,编译器对其分配的内存是两个字节。
如果我们定义了一个类变量,编译器会对我们的定义的类的语句分析,也会分配相应的内存空间。
不同的是在这些内存空间既有数据空间,也有函数空间。
由于编译器不知道如何处理我们定义的类操作,所以对其操作的工作必须有我们来完成。也就是去针对数据空间,
定义我们的操作函数(方法函数)。

一个对象是什么?对象就是我们指出的内存中我们定义的类的运行代码。由于要便于人理解。我们使用符号来
对应特定的内存空间块。
既然我们在写C的时候,经常要对一个变量初始化。
这样,我们定义类的时候,定义一个工作函数来初始化数据也必然会是常见的。
如此理解,会解释很多的现象。

最后,重复一遍:
类就是我们自己定义的一个变量类型,但是对 该变量类型定义的变量 的操作不是由编译器完成的,
而是由我们通过定义类的方法函数来完成的。
15 回复
#2
大师级的巫医2009-10-27 14:23
还是不懂
#3
xiaowanzhu2009-11-03 11:14
深奥 领教了
#4
handle22009-11-05 22:29
我觉得应该从更一般的角度去理解,自然界中本来就有一些事物,一些对象,不是人去定义类的数据成员与操作,而是作为独立的自然对象它本来就是这样的,它可以做些什么,用什么做,我们只是意识到他的这种属性后用编程语言去描述他,其实这是一种思想,描述自然的方式很多,有面向过程,面向对象的思想,还有其他,只是面向对象这种思想由java为人所晓,但确实早已存在的。也许语言只是表面,思想才是深层的东西,懂得一种思想,也许就会写出一种新的语言。
#5
xiangzhenlin2009-11-08 16:38
写得很好啊!
#6
Joe_Fan2009-11-09 10:33
面向对象的实现最终还是要靠面向过程,先学好面向过程才是王道。
现在的面向对象是用起来方便。
#7
fgchg9112009-11-14 01:08
楼主说的很对,类可以看成数据类型,就像int ,char, struct time, 很对,但也是废话
我先看到了那段红字,上面没细看
#8
fgchg9112009-11-14 02:07
类的实质,我觉得楼主这解释的根本就不是实质,只是表象,实质就应该研究类是怎么实现的,创建对象时自动调用构造函数,我们只看到一个单步就跳那去了,但这是怎么实现的,
我学c的,按c的理解,根本就没有看到函数调用,怎么就跑了呢
但在汇编代码里有这么一条
call        @ILT+5(tm::tm) (0040100a)
也就是那语句编译时被翻译成了函数调用,
唉,都是编译器的问题,你写一段代码,你认识的,它一编译,变成计算机认识的,至于计算机看到的是不是你所想的,这中间就看编译器了
#9
juejitianya2009-11-15 09:36
楼主说的很有道理,受益匪浅,呵呵
#10
谢志华2009-12-17 20:13
回复 3楼 xiaowanzhu
说得太好了
#11
钟科2010-01-05 23:37
赞一个
#12
zhuyunshen2010-01-05 23:42
呵呵
#13
啊我飞2010-02-02 18:06
人才啊,佩服!
#14
baifenghan2010-02-24 23:10
说的不错,但是它不是面向对象的核心所在,面向对象的核心在于思考解决问题的方式,是自然的,顺着现实世界的客观去思考,解决。
#15
lgnu2010-04-23 01:11
悲哀!!!!中国的程序员不会都在想这个问题吧!  悲哀!!!!!!!
#16
南国利剑2010-04-27 20:45
SO GOOD YOU ARE!
1