找回密码
 注册
查看: 3691|回复: 0

[转载]openFOAM基础——c++的面向对象思想

[复制链接]
发表于 2009-2-10 23:39:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
openFOAM是用c++写的,其基础思想便是面向对象。面向对象的编程思想随便找本相关的书都能看清楚。其最大的优点在于符合人类思考习惯,方便进行代码维护和开发,并且有利于提高代码重用率。但是面向对象的编程思想对于数值计算来说是否合适,可能还有待商酌,因为大量虚方法的引入势必降低运算速率。然而如果想在CFD领域有长足发展,我想积累是不可缺少的一个环节。而架构在面向对象程序设计思想上的openFOAM,应该是众多积累手段中较为有效的一种。

又扯上了,先说些基本的吧。

首先,什么是面向对象?面向对象其实从字面上也看不出有什么太多的意思,不过如果从程序设计的发展过程来看,就不难对“面向对象”这一概念进行理解了。“面向对象”是相对于其前的“面向过程”而言的。对于一个面向过程的程序而言,程序从头走到尾,代码的编写顺序基本上就是执行的过程。而面向对象的方法则不然,虽然面向过程的影子依然存在(没有过程、何谈程序,事实上所有现实中的事情都是过程化的),但是在程序执行过程中出现了“对象”这一概念,而且对象本身会发生“行为”,彼此之间实现“消息”传递,从而实现其驱动机制(本质上也就是函数调用)。

对象(object):哲学上讲,对象即指现实世界中各种各样的实体,可以指具体的事物也可以指抽象的事物。如苹果、飞机、规则、法律、方程、向量等等(凡是可以想到的东西)。每个对象皆有自己的内部状态和运动规律,在面向对象概念中我们把对象的内部状态称为“属性”、运动规律成为“方法”或“事件”。 在面向对象程序设计中,对象就是有着自己的属性、方法的“变量”,只不过我们以后不称之为变量,而叫“对象”了,这也是为了与一般的变量区分。

类(class):哲学上讲,类是具有相似内部状态和运动规律的实体的集合(或统称、抽象)。类是人们根据自己的认识水平以对象为素材归纳出来的。对于一个具体的类,它有许多具体的个体(属于此类),我们就管这些个体叫做对象。既然对象有属性、方法,那么由其归纳而得的类自然也有相应的属性、方法。在面向对象程序设计中,类的定义是最关键的,一个程序,在类的定义上是否合理,很大程度影响着编程的效率。我们定义一个类的时候,决定这个类到底都有哪些属性和方法,并且定义属性的时候给出属性的数据类型,定义方法的时候给出方法的实现过程。

在程序执行过程中,我们利用类来定义对象,真正使代码执行的,是对象。可以认为,类相当于数据类型,而对象则是具体数据。

谈到面向对象,不得不了解的三大机制:“封装”、“继承”、“多态”。这些正是面向对象的精华所在,没有了这些,谈不上面向对象。

封装的目的在于隐藏代码细节。具体来说,通过将类中的成员变量声明为private,再提供一个或者多个public方法用于实现对该变量的访问和修改,同时在类中定义接收其他对象消息的方法(称为类的接口),这种方式就是封装。类是封装的最基本单位,可见通过封装使得不同类之间相互独立了,从而防止了程序相互依赖性而带来的变动影响。总之,通过封装能够实现:隐藏类的实现细节;限制用户对属性的不合理访问;便于修改和进行数据检查。


继承的目的在于方便代码重用。如果每个类都需要从新定义,显然工作量太大了。面向对象的继承机制使得一个类可以在另一个类的基础上产生,他们分别为 “子类”和“父类”。子类可以继承父类所有的属性和方法,并可以进行扩充。这样一来,就爽的很了。这就是一种功能的积累,实现了不断在现有基础上前进。

多态的目的在于改写对象行为。试想,如果所有的子类都必须按照父类的规矩办事儿,那么也是不太现实的。在生态学中存在着“变异”,我们在编程时同样存在类似的情况。如果子类想把父类的某些功能变一下,怎么办,这时就用到多态这一概念了。具体做法就是在定义子类的时候对方法进行重新定义(当然也可以在原有基础上进行扩充)

有了以上这些基本概念,对于面向对象编程思想便应该有一个大概的认识了。不过概念好理解,精髓难掌握。如何组织类,应该是面向对象中最为重要的一个问题。

本文转载自http://blog.pfan.cn/bioexplore/33161.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表