在ADT里定义的某些操作来访问其中的数据,从而实现 了信息隐藏。在C﹢﹢中,我们可以用类(包括模板类)的说明来表示ADT,用类的实现 来实现ADT。 因此, C﹢﹢中实现的类相当于是数据的存储结构及其在存储结构上实现的对 数据的操作。
ADT和类的概念实际上反映了程序或软件设计的两层抽象:ADT相当于是在概念层(或称 为抽象层)上描述问题,而类相当于是在实现层上描述问题。此外,C﹢﹢中的类只是一个
由用户定义的普通类型,可用它来定义变量(称为对象或类的实例) 。因此,在C﹢﹢中, 最终是通过操作对象来解决实际问题的,所以我们可将该层次看作是应用层。例如,main 程序就可看作是用户的应用程序。
C++支持多范型的开发方式:面向过程,基于对象,面向对象,模版。 C++和C语言是兼容的。因此,你完全可以使用C++编译系统编写C语言的程序,因此, 支持面向过程编程是很自然的。 但是,使用面向过程编程,还能说是在使用C++编程吗? 另外,需要注意,C++语言,实际上是一种不同于C语言的新语言。在内存上,除了一些C 语言的元素之外,新的语言元素并不像C那样面向机器。 对于C++,你不能使用memcpy等内存操作的函数,很可能会出现错误。因为C++语言建 立在一些高级概念的规范上,这些规范并没有规定内存如何分配等机器方面的细节。 我在基于对象和面向对象编程范式辨析和主流编程语言中的应用 一文中已经指出基于对象 和模板是必须组合在一起使用的技术。
C++中首选的编程范式是“模板支持的基于对象”的编程范式。实现静态多态。
然后才是面向对象的编程范式。实现动态多态。
最后是C语言风格的面向过程编程。
C++的使用方法
使用C/C++开发环境,我们可以同时使用C和C++开发。既然C++和C是兼容的,我认为 完全没有理由使用C语言,而不使用C++进行开发。 即使是很小的问题,使用C++的“模板支持的基于对象”的编程范式也是首选的开发方式。 另一方面,在整个类库的外部,如果我们希望向其他语言提供接口,那么我们还应当提供C 语言的API函数作为接口。 C语言是程序世界的世界语。 使用C++的基本类型,struct,STL库的Vector,STL的string::c_str()等都可以得到C语 言兼容的接口。还不能使用异常。因为C语言不支持异常,而且C++本身的异常,在不同 的编译器中也可能不兼容。
总之
1,使用C++开发,只在外部接口中使用C语言开发。使用“模板支持的基于对象”的编程范 式,或者面向对象的编程范式。不要使用面向过程的编程范式。
2,尽量把代码放到类中,而不是使用全局或者命名空间的变量。
3,尽量不要使用操作符重载。
4,必须注意到C++不像C语言那样面向机器,不能对C++对象的内存布局进行假设。不
能根据内存内的数据直接构建对象。不要进行内存操作。
5,C++还是很面向机器的。很多语言规则都规定了内存的布局,必须按照规则定义、初始 化等等。这和Java,.NET,Ruby等语言不同。用惯高级语言的程序员特别需要注意C++ 和C对程序员的繁琐要求。
C/C++的设计哲学中, 始终把自己作为一门系统编程语言, 针对机器进行了很多优化。 因此, 对于人,就很不照顾了。很多规则很不人性化。但没办法,你必须适应它们!
它们就是为了高效而生的。它们就是汇编的替代者。
Java语言优劣考
Java是一门静态强类型面向对象的编程语言。它是C++和Smalltalk取长补短的产物。 Java是静态编译的强类型语言。你必须声明变量的类型,以便编译器能够检查代码的类型 是否正确。这和C++是相同的。Java是一门类型非常安全的编程语言。 Java只支持一种编程范式:面向对象编程范式。对于过时的面向过程编程范式并不支持。 也不支持基于对象的编程范式,也没有模板。 原因可能是,当java在90年代中期刚刚诞生时,面向过程的编程已被唾弃。而C++的基 于对象的编程方式,由于没有和模板相互结合,而名声扫地。C++对于面向对象的编程范式 的支持又比较差。 于是,汲取经验教训之后, Java作为一门纯正的面向对象编程语言诞生了。 Java使用面向对象的编程范式实现了动态多态,实现了抽象化的编程方式。取得了巨大的 成功。 Java语言中,除了基本类型是值类型之外,没有任何值类型,你也不能创建任何值类型。 这样,基于对象编程这条路就被卡死了。
虽然丧失了值类型的效率,但是也避免了基于对象编程的大量错误。Java语言中所有方法 也都是虚函数。这也是为了保证纯正的面向对象编程。Java语言是静态面向对象编程范式 的顶峰。使用面向接口的抽象编程,是有效使用java开发的唯一途径!另一方面,Java实 际上是一门动态语言。它是动态解释执行的。和Ruby,JavaScript等一样。
这使java具备了运行时的灵活性。可以实现自省,反射等C++等传统静态语言无法实现的 功能。
.NET语言优劣考
.NET是java的兄弟。 是微软因为被Sun排除在java之外而开发的一套语言。 主要包括C#, VB.net,C++/CLI等语言。
它的设计理念基本和java相同,也是一个支持静态面向对象编程范式的平台。
对于.NET语言平台,我选择C#和C++/CLI这两种语言进行论述。VB.NET和C#类似,这 里就不再多说了。
C#
C#.net还支持值类型, 也就是基于对象的编程范式。 (当然, .NET框架也是支持值类型的) C#.net的泛型类型替换是在运行时执行的。对于引用类型(在堆内存中创建实例的类型),它 使用类型强制转换,而不是C++模板的源代码生成来实现参数化类型。 对于值类型,则使用类似于C++模板的MSIL中间代码生成机制实现。 顺便提一下,java的泛型实现和C#的机制类似。也是使用强制类型转换实现。而且,Java 中没有值类型, 也不能对基本类型进行泛型操作, 因此没有C#和C++中的源代码扩张问题。 但是,老实说,java的泛型机制确实太弱了! C#语言首选的是面向对象编程范式。C#也可以使用泛型支持的基于对象的编程范式。
使用值类型,对于用惯面向对象编程范式的C#和java程序员来说有一定的难度。而且,提 升的效率也并不很高。
同时,在语法层面上,C# 泛型是实现参数化类型的更简单方法,不具有 C++ 模板的复杂 性。此外,C# 并不尝试提供 C++ 模板所提供的所有功能。
因此,C#泛型支持的基于对象编程要比模板支持的基于对象的编程要弱很多。
理念上,泛型编程有些不伦不类,有着太强的面向对象编程的气味。
C#中,使用泛型支持的基于对象的编程范式不如面向对象编程范式。
我认为,C#语言还是应该首先使用面向对象编程范式。
C++/CLI
C++/CLI是为了让C++使用.NET平台而提供的扩展机制。 .NET平台是类似于java的静态强类型动态执行的执行平台。 是面向对象编程范式理念的框 架。 C++/CLI使用了新的语法,使用C++/CLI进行.NET开发时,类似于C#编程。 同时,也可以使用模板进行C++/CLI编程。这是C++/CLI2005新增的功能。 使用C++/CLI进行.NET编程时,既可以使用C#样式的面向对象编程。也可以使用模板支 持的基于对象的编程范式进行开发。 可以把模板支持的基于对象的编程范式和.NET的面向对象的编程范式结合起来使用。 C++/CLI可以同时使用原生C++和.NET编程。如果使用.NET框架执行,那么C++原生代 码就会存放在生成的MSIL中间代码中,在运行时再使用C++编译器编译成机器码。
.NET的互操作机制
.NET运行时本身就是使用COM编写的,是一个COM服务器。因此,.NET和C
上一篇:
主流编程语言——WLP_Ruby代码
下一篇:
其它计算机论文:探究计算机基础教育教学的策略