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中的接口類用“interface”表示,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++沒有可比性,在此不再贅述。