C++与AS3
ActionScript3(简称AS3)与c++都是面向对象的编程(OOP)语言,都具有OOP的特性如封装、继承、多态等。二者在语法上有许多相似之处,基本上学过C++之后再学习AS3感觉并不是特别吃力。
但是二者也有着本质的区别,ActionScript3是脚本语言,也就是解释型语言,而C++是编译型语言。ActionScript3主要是基于ECMAScript4 Netscape Proposal标准,以AVM2作为其虚拟机,它的主要作用是在Flash内容和应用程序中实现交互性、数据处理以及其它许多功能。C++则是由最初的C语言演变而来,它的应用范围十分广泛,主要用于大型工程软件开发,主流的3种操作系统Windows,Linux,Unix,内核都是用C语言和汇编写的,上层高级特性是用C++写的。《魔兽世界》等几乎所有的网络游戏,百度搜索引擎,我们所用的大多数软件都是用C++写的(硬件也有很多用到C++的)。
AS3是一种“纯”OOP语言,而C++只能说是具有OOP特性,但除此之外还具有其它特性(所以才灵活)。在AS3中找不到任何过程式代码,所有的实现都在类及其方法中实现,甚至找不到我们熟知的main函数。而C++则依然保留了面向过程的特性,依照Effective C++中作者的观点,C++主要由4个子语言组成,分别是C语言,面向对象语言,泛型编程语言以及C++标准模版库(STL)。
以上主要从思想及本质上对比二者的区别(个人观点,部分参考网络),下面主要总结语法上的一些差别。
一、ActionScript3语言基础
1. AS3中所有的内置类型实际上都是对象,而我们俗称的“变量”实际上都是这些对象的引用名,虽然AS3也分值类型和引用类型,但是值类型的变量所指向的对象实际是一种不变对象。AS3中的值类型变量都是基本类型如int、uint、boolean、Number、String。而C++中的内置类型则都不是对象(因为没有方法)。
2.AS3中没有指针这一概念,全部都是引用,而C++中拥有指针。在AS3中我们不必担心生成的类对象没有及时销毁,因为AS3的垃圾回收机制会帮助我们处理这些事情。而在C++中我们无时无刻不在与指针所造成的内存泄漏做斗争,这也就是为什么在C++的类定义中通常会有析构函数(~Fun())而在AS3中则没有。
3. AS3程序中每条可执行语句之后可以不加分号(“;”,但是加上使代码更加易读),而C++中每条语句之后必须加上分号。
4. AS3的基本类型较少,表示整数的只有int和uint,表示浮点数的只有Number,而不像C++里面整数有short、int、long,外加前面各一个unsigned,浮点则是float、double。AS3中的字符串中每个字符都是Unicode字符,但是它没有表示单个字符的变量(如char,但是后续可能会加上)。C++中则有char这个类型,并且字符串都是用char的数组来表示的。
5. AS3中的数组是稀疏数组,不支持类型数组,即可以在同一个数组中存放不同类型对象的引用。而C++中的数组则是类型数组,里面存储的类型必须一致(当然可以存放基类类型指针指向派生类类型的对象)。
6. AS3中变量的默认值类型比较多,特别的是null、NaN、undefined,通常Flash Player内置类和用户创建的类所产生的对象默认值都是null,而未定义类型的变量默认值是undefiened。Number类的默认值类型是NaN。在C++中则没有这么多类型。
7. AS3中“==”运算符对于基元数据类型而言是比较两边值的大小,而对于复杂数据类型则是比较两边对象的引用是否相同,即使两边值相同,但是引用不同,则结果任然是false。C++中的“==”号则主要是直接比较值的大小(当然可以依靠重载运算符改变其比较方式)。在AS3中还拥有“===”运算符,它和“==”的区别在于它在比较时不会执行任何类型转换,只要类型不同则为false(对于数值类型例外)。在C++中则没有此运算符。
8. AS3中的类型转换主要利用as运算符,在C++中则是利用“*_cast”进行类型转换。
9. AS3中的delete关键字主要用来删除对象动态事例属性,C++中的delete则是收回指针所指向的动态分配的内存空间。
10. 逻辑控制方面与C++基本无差别,无非是条件判断(如if、if else、if...else if...else)以及循环(如while、do-while、for),break、continue、switch等。区别在于AS3中还有for...in和for each...in,它们所枚举的一般是动态属性。AS3中的break和continue可以利用标签来控制程序执行流程。AS3的switch中的case分支中的值可以是任意类型,而C++中则只能是整数。
11. AS3中函数有两种声明方法,分别是函数语句定义法和函数表达式定义法,他们的区别在此不赘述。而C++中则只有一种声明方式(当然可以考虑独立的函数或是类中的方法)。
12. 在AS3中函数的参数全部是按照引用传入的,而C++中则分按值、按指针和按引用三种传递方式。
13. 在AS3中函数是不能重载的(可以利用在方法的“()”中写入“...参数”来实现),C++中函数可以重载。
14. AS3中没有内置的枚举类型(可以利用静态属性部分实现),C++中则有原生的enum。
15. AS3程序的文件中有 “.fla”、“.swc”和“.as”文件,SWF文件是Flash文件格式,它里面放着一堆可以被FlashPlayer所理解的标签,容纳着媒体资源和ABC字节码(FlashPlayer运行时理解)。而FLA文件是FlashCS3工具使用的源文件后缀,里面有创作的图形、动画元件以及嵌入的媒体资源。AS文件则是类定义文件。C++中主要是与“.h”文件,“.cpp”文件打交道。
二、ActionScript3面向对象编程
1.AS3中定义一个类通常除了与“class”打交道,还有“package”。package主要用来定义包路径,一个Class如果想要被外部访问,必须放在一个package当中。而在C++中则没有package这一概念,但是需要引用其它文件中的类定义时会使用“include”,AS3中则没有。
2. AS3中的访问控制除了有public、protected、private以为,还有internal,并且类定义中若不人为指定访问控制,则以internal默认,它表示“包内可访问”,即同一个包中的不同文件可以互相访问彼此中的类定义。
3. AS3中Class分为动态类(加dynamic关键字)和密封类,动态类在运行时可以加入额外的属性和方法。C++中则只有密封类。
4. 在AS3中导入其它类定义使用“import”关键字外加包路径,而C++中使用“#include”。
5. 在继承中通常要改变来自父类中某个属性或者方法中的内容,但不改变名称,从而达到多态的效果,即所谓的“重写”,在AS3中可以通过关键字“final”来限制子类重写,而C++中则没有这一关键字(当然都可以利用private来限制游戏http://www.shengshiyouxi.com)。final还可以用来限制类被继承。AS3中重写时需要用“override”关键字,C++中也没有这一关键字。
6.AS3中子当子类需要明确调用父类中的方法时,可以利用super语句,它可以看成是一个变量,直接持有父类的引用。
7. AS3中没有对抽象类的原生支持,即关键字“abstract”(可以利用技巧实现),C++中则有“abstract”关键字。
8. AS3中的接口类用“inte易做图ce”表示,C++中则没有这一关键字(可以用纯虚函数实现)。
三、ActionScript核心类
1. AS3中的Array功能强大,拥有许多方法,类似于C++中STL里面的容器如vector。
2. AS3中引入了强大的正则表达式,并且原生支持,C++中并无这一功能。
3. AS3中处理XML就如同处理原生数据类型一样方便简单(严格执行E4X标准),C++则不然。
4. AS3异常处理拥有finally,C++中则没有。
FlashAS3中的其它内容,如Flash Player API、AS3视觉编程都是flashAS3针对FlashPlayer交互等功能所特别定制的,与C++没有可比性,在此不再赘述。