歷史淵源
C的誕生
1978年,貝爾實(shí)驗(yàn)室正式發(fā)表了C語(yǔ)言月腋,后來(lái)由美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)ANSI在此基礎(chǔ)上制定了C語(yǔ)言標(biāo)準(zhǔn)蟀架,并與1983年發(fā)布,即為ANSI C榆骚。
C++的誕生
1983年片拍,貝爾實(shí)驗(yàn)室又推出了C++。C++進(jìn)一步擴(kuò)充和完善了C語(yǔ)言妓肢。成了一種蠻像對(duì)象的程序設(shè)計(jì)語(yǔ)言穆碎。
Objective-C的誕生
它的發(fā)展主要是因?yàn)?988年Steve Jobs的NextStep采用Objective-C作為開發(fā)語(yǔ)言,因此MacOS X以及IOS上的開發(fā)最佳語(yǔ)言自然也就是Objective-C了职恳。同時(shí)Objective-C是蘋果Mac OS X 上開發(fā)的首選語(yǔ)言所禀,主要是因?yàn)镸ac OS X 技術(shù)源自NextStep的OpenStep操作系統(tǒng),因?yàn)镺PENSTEP的軟件架構(gòu)(framework)都是用Objetive-C 寫成放钦。然后OC是由Brad Cox在80年代初在第一個(gè)純面向?qū)ο笳Z(yǔ)言Smalltalk基礎(chǔ)上寫成色徘。Brod Cox創(chuàng)立了StepStone公司進(jìn)行OC語(yǔ)言的推廣。最終OC在1992年獲得了GNU gcc編譯器的支持操禀,因此OC也是GNUstep在Linux和其他平臺(tái)上的開發(fā)語(yǔ)言(GNUstep是什么褂策,可以參考其官方網(wǎng)頁(yè)http://www.gnustep.org/)。
語(yǔ)言特點(diǎn)
C:
- 作為一種結(jié)構(gòu)化語(yǔ)言颓屑、層次清晰斤寂,便于按模塊化方式組織程序,易于調(diào)試和維護(hù)揪惦;
- 表現(xiàn)能力和處理能力極強(qiáng)遍搞。可以直接訪問(wèn)內(nèi)存的物理地址器腋,進(jìn)行位(bit)一級(jí)的操作溪猿;
- C語(yǔ)言實(shí)現(xiàn)了對(duì)硬件的編程操作,因?yàn)镃語(yǔ)言集高級(jí)語(yǔ)言和低級(jí)語(yǔ)言的功能于一體即可以用于系統(tǒng)軟件的開發(fā)纫塌,也適用于應(yīng)用軟件的開發(fā)诊县;
- C語(yǔ)言還有效率高,可移植性強(qiáng)等特點(diǎn)措左。因此廣泛地移植到了各類型計(jì)算機(jī)上依痊,從而形成了多種版本的C語(yǔ)言。(主要為演進(jìn)成了后來(lái)的C++)
C++:
- 在C的基礎(chǔ)上進(jìn)行了擴(kuò)展和完善怎披,使C++兼容了C語(yǔ)言的面向過(guò)程特點(diǎn)胸嘁,又成了一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。
- 可以使用抽象數(shù)據(jù)類型進(jìn)行基于對(duì)象的編程钳枕。
- 可以使用多繼承缴渊、多態(tài)進(jìn)行面向?qū)ο蟮木幊獭?/li>
- 可以擔(dān)負(fù)起以模板為特征的泛型化編程
Objective-C:(OC )
- OC是C的超集,擴(kuò)展了C語(yǔ)言使它具備面向?qū)ο笤O(shè)計(jì)的能力鱼炒。例如類衔沼、消息、繼承昔瞧;同時(shí)在OC的代碼中可以有C和C++語(yǔ)句指蚁,它可以調(diào)用C的函數(shù),也可以通過(guò)C++對(duì)象訪問(wèn)方法自晰;
- OC不同于C++,盡管都有面向?qū)ο蟮哪芰δ麄兎謱俨煌膶W(xué)派,OC屬于SmallTalk學(xué)派酬荞,C++屬于Simula 67學(xué)派(一種早期的面向?qū)ο笳Z(yǔ)言)搓劫。
- OC可以底層系統(tǒng)編程瞧哟,另一方面可以支持利用動(dòng)態(tài)架構(gòu)進(jìn)行開發(fā)。
OC于C++的比較:
兩者都是面向?qū)ο笤O(shè)計(jì)語(yǔ)言枪向,有很多相似之處勤揩,但屬于不同的學(xué)派,也有不同之處:
- 繼承:OC不支持多繼承秘蛔,C++支持多繼承
- 函數(shù)調(diào)用:OC通過(guò)傳遞消息實(shí)現(xiàn)函數(shù)調(diào)用陨亡,而C++直接進(jìn)行函數(shù)調(diào)用
- 定型:OC是動(dòng)態(tài)定型,所以它的類庫(kù)比C++容易操作深员。OC在運(yùn)行時(shí)可以允許根據(jù)字符串名字來(lái)訪問(wèn)方法和類负蠕,還可以動(dòng)態(tài)連接和添加類。而C++倦畅,對(duì)象的靜態(tài)類型決定你是否可以發(fā)消息給它遮糖。
- 接口:OC采用協(xié)議(正式和非正式)的形式來(lái)定義接口,而C++采用虛函數(shù)的形式來(lái)定義接口
- 方法重載:OC不支持方法重載滔迈,C++支持方法重載。方法重載就是方法名相同燎悍,參數(shù)個(gè)數(shù)相同敬惦,但是參數(shù)類型不同或者返回值類型不同谈山。
兩者的主要差別是因?yàn)镺C既支持動(dòng)態(tài)類型也支持靜態(tài)類型。對(duì)于id類型的變量奏路,變量只是一個(gè)容器畴椰,本身是沒(méi)有類型的,或者知識(shí)屬于最基本的類型鸽粉,所以也不需要強(qiáng)制類型轉(zhuǎn)換斜脂。因?yàn)榫幾g器不會(huì)對(duì)檢查變量類型是否正確,只是運(yùn)行時(shí)如果類型不正確會(huì)才會(huì)產(chǎn)生異常触机。
而C++是靜態(tài)語(yǔ)言帚戳,編譯時(shí)會(huì)檢查類型,所以必須要加上強(qiáng)制類型轉(zhuǎn)換儡首,否則編譯器就會(huì)報(bào)錯(cuò)片任。
編譯時(shí)的不同
OC:雖然Objective-C具備動(dòng)態(tài)類型的能力,但編譯期的靜態(tài)類型檢查依舊可以應(yīng)用到變量上蔬胯。附加的類型信息讓編譯器在編譯時(shí)可以檢查變量類型对供,并對(duì)類型不符的變量提出警告。
C++: 編譯要求嚴(yán)格
OC如何實(shí)現(xiàn)多繼承
Objective-C在NeXT時(shí)期曾經(jīng)試圖引入多重繼承的概念氛濒,但由于協(xié)議的出現(xiàn)而沒(méi)有實(shí)現(xiàn)之产场。
協(xié)議類似于Java與C#語(yǔ)言中的“接口”鹅髓。在Objective-C中,有兩種定義協(xié)議的方式:由編譯器保證的“正式協(xié)議”京景,以及為特定目的設(shè)定的“非正式協(xié)議”迈勋。
非正式協(xié)議為一個(gè)可以選擇性實(shí)現(xiàn)的一系列方法列表。非正式協(xié)議雖名為協(xié)議醋粟,但實(shí)際上是掛于NSObject上的未實(shí)現(xiàn)分類(Unimplemented Category)的一種稱謂,Objetive-C語(yǔ)言機(jī)制上并沒(méi)有非正式協(xié)議這種東西重归,OSX 10.6版本之后由于引入@optional關(guān)鍵字米愿,使得正式協(xié)議已具備同樣的能力,所以非正式協(xié)議已經(jīng)被廢棄不再使用鼻吮。
正式協(xié)議類似于Java中的"接口"育苟,它是一系列方法的列表,任何類都可以聲明自身實(shí)現(xiàn)了某個(gè)協(xié)議椎木。在Objective-C 2.0之前违柏,一個(gè)類必須實(shí)現(xiàn)它聲明匹配的協(xié)議中的所有方法,否則編譯器會(huì)報(bào)告錯(cuò)誤香椎,表明這個(gè)類沒(méi)有實(shí)現(xiàn)它聲明匹配的協(xié)議中的全部方法漱竖。Objective-C 2.0版本允許標(biāo)記協(xié)議中某些方法為可選的(Optional),這樣編譯器就不會(huì)強(qiáng)制實(shí)現(xiàn)這些可選的方法畜伐。
常用的有使用協(xié)議和類別實(shí)現(xiàn)多繼承馍惹。
OC中可以使用以下方式實(shí)現(xiàn)多繼承:
- 協(xié)議
- 類別
- 消息轉(zhuǎn)發(fā)
- 強(qiáng)制轉(zhuǎn)換
- 組合模式
參考資料:
http://blog.csdn.net/dqjyong/article/details/7663866