C/C++與Java的之間的差異

來源:互聯網
上載者:User

C/C++與Java的之間的差異
Difference between Java and C/C++

原文參見:http://docs.rinet.ru/Jintra/appe.htm
i.a_7 譯

 

前置處理器(Preprocessor):
所有的C/C++編譯器在編譯過程中有一個階段的處理稱之為前置處理器.C++的前置處理器主要是進行搜尋和置換被#define,#typedef等指示符所聲明的標識符.儘管大多數C++的擁護者不提倡使用這種由C語言繼承而來的特徵,這種用法還是在C++程式員中被廣泛的使用.C++中大部分前置處理器的定義是儲存在用來補充實際代碼檔案的標頭檔中.

使用前置處理器的方法帶來的問題就是,程式員很容易在不經意間增加了程式的複雜度.一個例子就是在一個項目中,眾多程式員使用#define,#typedef等指示符來標示他們自己所建立的一系列名詞,其直接導致的結果就是其他的程式員為了理解程式,不得不查看所有的標頭檔來找到相應的資訊,這就使得代碼的維護和重用變的近乎不可能.另一個使用前置處理器方法的問題就是當進行型別檢查或有效性檢查時缺乏足夠的穩定性.

Java中沒有前置處理器.它提供了和C++前置處理器有著相似的函數功能,而且加深了控制.用常量資料成員來替代#define指示符,用類定義來替代#typedef所使用的場合.這樣就使得Java的原始碼比C++更加連貫和可讀.另外,Java程式並不使用標頭檔,Java的編譯器直接由同時包含類的定義和方法實現的原始碼中建立類定義.

 

指標
大多數開發人員都認同在使用C/C++編程時,指標的誤用是造成程式錯誤的主要原因.簡而言之,當你有指標時,你就有可以對記憶體進行破壞的能力.C++程式員通常使用複雜的指標運算來建立和維護動態資料結構,結果就是C++程式員花費大量時間在解決由那複雜的指標運算所造成的千奇百怪的問題.

Java語言不支援指標.Java通過提供大量的引用來實現與指標相似的操作.Java中,所有的數組和對象都是通過引用來進行傳遞的.這種方法避免了由於指標的錯誤管理所造成的常見錯誤.這使得編程在很多方面變得簡單化,因為除了那些經驗老到的程式員,一般人很容易混淆正確的指標用法.

你可能會想,由於沒有指標,在Java中就無法實現例如動態數組等很多資料結構.事實上,任何指標能夠完成的任務都可以用對象和數組對象更加可靠的實現.你還能受益於由Java的runtime system提供的安全性保障,如對所有數組的索引進行邊界檢查.

 

結構和聯合(Structures and Unions)
在C++中有三種複雜的資料類型:類,結構和聯合.Java僅僅實現了這三種類型中的一種:類.Java會強制使用者使用類來替代使用結構或者聯合來實現所需要的功能.儘管聽上去程式員需要為此而付出更多的工作,實際上,由於類可以簡單的類比出結構和聯合,這使得代碼更加協調.Java的設計人員誠摯的希望保持語言的簡單性,所以就消除了語言特徵中的重複的部分.

函數(Functions):
在C語言中,代碼是由各個子程式所構建的函數所組織而成的.C++添加了類的概念和類的方法,也就是與類相關的函數.C++中類的方法跟Java中類的方法是很相似的.然而,由於C++對C的支援,也就沒辦法讓C++的程式員不在類中使用函數.函數跟方法的混合使用就直接導致了對程式理解的困惑.

Java中沒有函數的概念.作為一種比C++更加純粹的物件導向語言,Java強製程序員將所有的程式都整合到方法中.強制使用方法代替函數並沒有其他的限制.結果就是,以方法的形式來實現程式鼓勵了程式員更好的組織代碼結構.記住這一點:使用函數並沒有任何程式途徑上的錯誤.它只是與Java範例中物件導向的精髓不相符.

 

多重繼承(Multiple Inheritance)
多重繼承是C++的一個特徵,使得你可以從不同的父類派生子類.儘管多重繼承有時是一種強有力的繼承方式,但由於其複雜性而導致的錯誤使用,常常造成很多的問題.從編譯器的角度考慮,多重繼承也是很複雜而不易實現的.

Java選擇另外一種方式而沒有直接支援多重繼承.你可以通過Java的介面(interfaces)來實現和多重繼承相類似的功能.Java的介面提供對象方法描述而不包含實現部分.

字串(Strings)
C和C++並沒有把文本字串加入到其內建類型中去.C和C++中使用的一種標準技術就是以空為結束符在數組中標示字串.

在Java中,字串是作為第一個類對象來實現的(String和StringBuffer),這就意味著Java為字串提供了核心級的支援.Java用對象來實現字串有如下優點:
.跨平台和語言的建立字串和對其中的元素訪問進行管理
.因為Java中字串是定義為語言的一部分而不是擴充的一部分,這就使得Java字串函數具有可預見性(predicatably).
.由於Java執行的是擴充運行檢查(extensive runtime checking),這就可以協助消除一些棘手的執行階段錯誤(runtime errors).

 

goto語句(The goto Statement)
即便是在C和C++中,令人生畏的goto語句也是飽受爭議,但從技術上講,goto語句是語言合法的一部分.對goto語句由來已久的批判來自於其會造成代碼結構的混亂和不可讀,有時甚至會導致一種所謂"意大利麵"般不可預測性.goto語句一般適用在那些不需要進行判斷就進行跳轉的地方,更加結構化的分支技術.

出於這樣或者那樣的原因,Java並不支援goto語句.Java語言指定goto作為一個關鍵字,但是並不支援其使用.我想Java的設計者甚至是想消除把"goto"作為一個標識符的可能性.不包含goto語句的Java語言使得語言簡單化而且避免了寫出結構混亂的代碼.

 

操作符重載(Operator Overloading)
操作符重載,作為C++的一個顯著的特徵,而Java並不支援.儘管Java通過類的一些實現來提供相似的功能,仍然缺少了一些由操作符重載帶來的便利.然而,從保護Java的角度來看,操作符重載有時可能變得技巧性太強(tricky).毫無疑問,Java的開發人員讓語言不支援操作符重載的決定使得Java儘可能的簡單化.

 

自動縮減(Automatic Coercions)
自動縮減與在C/C++中出現的資料類型的隱式轉換相關.例如:在C++中你可以把一個float的值賦值給一個int變數,這樣就會導致一些資訊的丟失.Java並不支援C++風格的自動縮減.在Java中,如果某種縮減會導致資料的丟失,那麼你就必須顯式的指定將要轉換的資料類型.

可變參數(Variable Arguments)
C/C++允許你聲明一個函數使用可變參數,例如printf.儘管這是一個便捷的特徵,但同時也使得編譯器無法對參數類型完整的進行檢查,這也就意味著運行時會出現一些你所不知道的問題.Java不支援可變參數.

 

命令列參數(Command-Line Arguments)
系統傳遞給Java程式的命令列參數跟系統傳遞給C++程式的命令列參數是一種截然不同的.受限,傳遞給兩種語言的參數的數目不同.在C/C++中,系統傳遞給程式兩個參數:argc和argv,前者指定了儲存在argv中的參數個數,後者是一個指向儲存著實參數組地址的字元指標.在Java中,系統傳遞給程式一個單獨的值:args.args是一個包含了命令列參數的字串數組.

在C/C++中,傳遞給程式的命令列參數包含調用函數的名字.這個很少使用到的名字是作為第一個實參儲存的.在Java中,你已經知道了與類名稱相同的程式的名字,所以就不需要把程式的名字作為命令列參數進行傳遞.因此,Java運行時系統(runtime system)僅僅傳遞調用程式名稱後的參數.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.