APP下载

浅谈用C++动态扩展C#程序的方法

2014-04-02张俭王桂华

卷宗 2014年12期
关键词:子类面向对象C语言

张俭 王桂华

摘 要:随着计算机应用领域越来越广泛,许多软件变得越来越复杂,代码量也越来越庞大,开发团队人员不断增加,这时候面向过程的开发模式就显得有些吃力了,于是一种称为面向对象的软件开发方法应运而生,这就是后来的C++,它在C语言的基础上增加了面向对象的功能,故从某种程度上讲,C语言是C++的子集。本文将主要探讨用C++动态扩展C#程序的方法。

关键词:C++;扩展;C#程序

C语言是一种结构化语言,它主要侧重于算法和数据结构,因此C程序设计是一种面向过程的开发方式,它强调的更多的是解决问题的算法,并通过适当的数据结构将相应的过程转化为可执行的代码。需要注意的是,虽然C++是在C语言的基础上发展起来的,但并不是说C++比C语言高级,两者的编程思想和应用的领域不一样,在各自的领域谁也不能替代谁。之所以说C++比C语言先进,只是因为面向对象设计的概念使得C++程序设计更符合设计理念。C++中的C语言相对于原来的C语言有所加强,因为它引入了重载、内联函数等新功能,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和容器类等。

1 C++语言概述

C++语言是Bjarne Stroustup在C语言的基础上开发出来的。它引进了面向对象的概念和功能,为程序员提供了一种与传统结构化程序设计十分不同的思维方法。C++是在C语言基础上扩充而成的,除了一些细微的差别外,C++可以算作是C的超集。C语言功能强、效率高、风格简洁,适用于大多数的系统程序设计任务。C++保留了C的这些优点。C++的一条设计原则是扩充C语言但不修改C语言。这样,使得C++与C之间取得了兼容性。

面向对象程序设计一般从对象模型入手,让这个模型能够契合与之对应的问题空间,通过对象来描述系统空间的实体,这样就可以通过获取对象的状态信息得到输出或实现过程控制。关于对象这一概念,目前还没有统一的定义。一般的,我们认为对象是包含现实世界物体特征的抽象实体,而这些实体具有它,ff]自己的一些属性和相关的操作方法,比如把人抽象化为一个对象,那么它就有性别、身高、体重、年龄等属性,并且具有说话、眨眼、动手、动脚等能力。在程序设计领域,我们不妨用这样的等式来进行描述:对象=数据+作用于这些数据上的操作方法。

2 用C++动态扩展C#程序的方法

在C++中,用类来描述具有相同属性和操作方法的对象的集合,即类规定了这些对象的公共属性和方法,而对象是类的一个实例。例如,假设人是一个类,那么,具体到某个人,则这个人(比如张三)就是一个对象。类与对象之间的关系,有点类似于程序设计语言中变量类型和变量的关系。面向对象的编程方法主要具有如下几个基本特征:

1.抽象:抽象是指在描述一个目标时,只关注我们感兴趣并对我们有用的部分,不必关心其中的细节。比如,我们在做一个员工考勤系统时,对于对象员工,我们只关心他的姓名、工号以及所在的部门,而不必关心他的身高、体重等信息。抽象通常包括两个方面,一是处理过程抽象,二是数据抽象。封装是一种机制。封装性是借助于一种新的结构和数据类型机制类(class)来实现的。事物的组成成分用各种数据类型存储,对这些成分的操作用函数来实现。把一个数据结构同操作数据的函数(行为或方法)组合在一起,即把这些数据和函数封装在一个类中,便于分辨事物的描述。这种封装性还会保护类中的数据与函数安全,以防止外界干扰和误用。例如,有一组数据是准备画一个图形所需的信息,传统的c方法是将数据与程序分别处理,程序设计者可以直接读取数据,但日后若发现这样的处理结构不太好需要修改时,则需修改整个程序,而在C++中就不必如此麻烦。可通过关键字class重新定义类,使用原来的程序达到修改后的结果。

2.继承:对象的一个新类从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。假如把水果抽象为一个类,并把它作为基类,那么苹果类就可以从水果类中派生出来并成为它的子类:派生类共有三种C++类继承方式:公有继承(public)、私有继承(private)和保护继承(protected),上面的例子使用的是公有继承。对于公有继承,基类的公有成员和保护成员可以作为其派生类的公有成员和保护成员,派生类的成员函数可以访问基类中的公有成员和保护成员,无法访问基类中的私有成员,派生类的对象可以访问基类的公有成员:对于私有继承,基类的公有成员和保护成员都作为其派生类的私有成员,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承;对于保护继承,基类的所有公有成员和保护成员都成为派生类的保护成员,基类的公有成员和保护成员只能被它的直接派生类成员函数或友元访问。

构造函数和析构函数不能被继承,因此构造派生类的对象时,需要对基类数据成员、新增数据成员和成员对象的数据成员进行初始化,派生类构造函数的参数表部分既需要包含子类某些数据成员的初始值,也要包含基类的数据成员的初始值。如果基类没有默认的构造函数,那么派生类必须具有给基类构造函数提供参数的构造函数。

C++的继承特性很好地解决了软件的可重用性问题。例如,所有的Windows应用程序都有一个窗口,它们可以看作都是从一个窗口类派生出来的。但不同的应用程序都有不同的用途,有的用于文字处理,有的用于图像处理,有的用于音频处理等,这是由于派生出了不同的子类,而各个子类都添加了各自不同的特性。

对象和类的概念的提出,不仅有利于模块的重用性,而且有利于方法和数据的封装,以保证模块具有较好的独立性,使得程序维护和修改较为容易,对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

3.虚函数与多态性:C++的多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(Override),或者称为重写,但是,只有重写了父类的虚函数才能体现多态性。那么,什么是虚函数呢?简单地说,那些被“virtual”关键字修饰的成员函数就是所谓的虚函数。虚函数的作用是用来实现多态性(Polymorphism),多态性是将接口与实现进行分离,即以共同的方法实现,但因个体差异而采用不同的动作。

要理解好多态性,首先必须把多态性与函数重载这两个概念区分开来。函数重载是指基于不同的参数列表(类型、个数或两者皆不同),同一个函数名称可以指向不同的函数定义。例如,对于如下所示的两个同名函数Add,调用函数Add(1,2)和Add(1,2)的结果是不一致的,前者为3而后者为51。

3 结论

因此,在过去的软件开发实践中积累起来的大量的C的库函数和实用程序都可以在C++中使用,而且C++语言的语法和C语言极为贴近。C语言的程序员是能够很快和很容易地学会使用C++的。

参考文献

[1]王大龙. 基于C#的动态图形显示设计与实现探讨[J]. 软件,2013,11:96-97.

[2]周建儒. 基于单继承的“动态多态性”的分析与应用[J]. 信息技术,2014,03:162-164.

[3]王德超. 程序设计中的动态数组空间分配方法研究[J]. 软件导刊,2014,04:6-8.

[4]马瑞敏. OOPC++中的动态多态性及其底层实现机制研究[J]. 长治学院学报,2014,02:54-56.

[5]李文娟,陈晓轩,龚立娇,陈旭东. 基于动态性能空间的优化控制方法设计[J]. 工程设计学报,2014,05:456-468.

[6]韩翠翠. c#调用c++动态链接库的分析与解决[J]. 民营科技,2013,02:67-68.

猜你喜欢

子类面向对象C语言
卷入Hohlov算子的某解析双单叶函数子类的系数估计
基于Visual Studio Code的C语言程序设计实践教学探索
面向对象的计算机网络设计软件系统的开发
基于C语言的计算机软件编程
关于对称共轭点的倒星象函数某些子类的系数估计
面向对象的数据交换协议研究与应用
高职高专院校C语言程序设计教学改革探索
面向对象Web开发编程语言的的评估方法
论子函数在C语言数据格式输出中的应用
面向对象信息提取中影像分割参数的选择