當前位置:才華齋>計算機>C語言>

C語言與C++和JAVE的區別

C語言 閱讀(3.05W)

很多人不明白C語言與C++和JAVE之間的區別,為此,本站小編就為大家收集整理了下面的內容,歡迎閱讀!

C語言與C++和JAVE的區別

Java程式中的每個變數要麼是基本資料型別(boolean, char, byte, short, int, long, float, double),要麼是對物件的引用。

C++有許多種基本型別,額外還有struct, union, enum, 陣列和指標,C++指標可以指向物件,也可以不指向物件。

Java沒有列舉、聯合型別,因為Java認為沒有必要。將可有可無的語言元素去掉是Java對C/C++做出的一大改變,因此,普遍認為Java較C++更輕便,更精簡。

Java採用Unicode字符集,C++通常用ASCII字符集。但ASCII是Unicode的子集,對於習慣於ASCII的程式設計師感覺不到區別。

Java中的boolean型別不能轉換成其他型別,反之亦然。C++最近引進了bool型別,代表布林型別,整型也作為邏輯判斷。

模板是一種“泛型程式設計思想”,它有別於“面向物件程式設計思想”。C++在很大程度上已經支援了這種新型程式設計方法,特別是STL的出現。

Java目前仍未支援泛型程式設計,不過據說Sun公司有在Java中引入模板的計劃。

C++支援“運算子的過載”,這是它的一個很重要的多型特徵,是資料抽象和泛型程式設計的利器。它允許直接對物件進行四則運算,正像基本資料型別那樣。

Java不支援這種多型機制,也是為降低複雜性。

兩種語言都支援方法過載(overloading)。

在C++中,為了允許執行時動態決定哪個函式被呼叫,一個函式必須用virtual修飾。virtual關鍵字被自動繼承,用以支援多型。

凡是沒有用virtual修飾的成員函式(包括static)都是靜態繫結的,即在編譯時決定呼叫哪個版本。

而在Java中,除了static、final、private是靜態繫結以外,所有方法一律按動態繫結處理。

C++中有“拷貝建構函式”的概念,在三種情況下,自動呼叫它。

用一個物件初始化另一物件。

物件作實參進行函式呼叫。

物件作函式的返回值。

通常,當一個物件需要做“深拷貝”(錢能:《C++程式設計教程》)時,我們需要為它事先定義“拷貝建構函式”、“賦值運算子的過載函式”和“解構函式”;否則編譯器將以“按位copy”的形式自動生成相應的預設函式。倘若類中含有指標成員或引用成員,那麼這三個預設的函式就隱含了錯誤。

Java則沒有這種語法結構和語義邏輯。

C++支援inline函式,可以避免函式的堆疊呼叫,提高執行效率。

  Java無這種語義

C++中,建構函式的初始化列表是這樣使用的:首先按繼承順序呼叫基類的建構函式構造基類物件,然後按宣告順序呼叫成員物件的建構函式構造成員物件,最後對列表中出現的成員變數做初始化。

Java不採用初始化列表這種構造機制。

它們的構造順序基本一致。

  靜態變數初始化

靜態初始化塊(Java)

呼叫基類的建構函式構造基類物件。

  例項變數的初始化

建構函式的其餘部分

Java使用abstract關鍵字修飾抽象方法或抽象類。

  C++的對等語法是“純虛擬函式”和“抽象類”

兩者都使用抽象類作為繼承層次中的.基類,提供一般概念,由子類實現其抽象方法,且抽象類都不能被直接例項化為物件。

Java中有final關鍵字,修飾類、方法或變數。

  final類不能被繼承

final方法不能被子類覆蓋

  final變數就是常量

C++中沒有這個關鍵字,常量可以使用const或#define定義。

const還可以修飾成員函式,即“常成員函式”,當一個const成員函式修改成員資料,或呼叫非const成員函式時,編譯器會報錯。

我們應將不修改成員資料的函式宣告為const。

Java和C++中的static關鍵字語法和語義基本相同。

static成員變數又叫類變數,被類的所有物件共享。

A::x (C++):必須在類體外初始化

A.x (Java):必須在類體內初始化

static成員方法又叫類方法,訪問static變數。

A::f( ) (C++)

A.f( ) (Java)

  兩者都有內部類和區域性類的語法和語義

Java中沒有友元函式和友元類的概念,嚴格支援封裝,不允許外部方法訪問類的私有成員。

而C++支援friend關鍵字,允許外部方法訪問類的私有成員,因此不是一種純面向物件的程式語言。

Java中類或interface可以用public修飾,也可以不修飾;而C++類不能修飾。

三種訪問許可權的語義相同,語法略有差別。

C++中還有繼承許可權修飾符,Java則沒有。

class A: protected B, public C (C++)。

class A extends B (Java)。

Java有super關鍵字,指代父類物件,通常被用於呼叫父類的構造方法或一般方法。

  C++則沒有super關鍵字

兩者都有this,指代當前物件。

Java有package的概念,可以將類組織起來,便於打包和部署,也有利於類的安全。C++沒有這個概念,一個類可以被任意類訪問。

Java applet可以被嵌入HTML文件中,然後由Web瀏覽器下載和執行。

Java API有對網路通訊的特別支援。

  C++則無內建網路功能

C++程式設計師必須顯式地實現動態記憶體管理,在解構函式中用delete運算子或free( )函式釋放物件和其他動態分配的資料空間,否則會造成“記憶體洩露”。

而在Java中,垃圾收集是自動的。當物件的最後一個引用變數被釋放掉,這個物件就成為垃圾收集器的候選物件了。

因此Java不支援解構函式。

finalize( )方法主要被用來釋放先前開啟的非記憶體資源,如檔案控制代碼。

Java原始碼被編譯成位元組碼(s檔案),位元組碼是一種只有JVM才能識別的二進位制低階程式碼,它與具體的處理器無關,要由安裝在OS之上的JVM解釋執行,轉換成相應平臺的機器碼,因此Java是體系結構中立和跨平臺的。

而C++直接被編譯成底層平臺的二進位制機器碼,由CPU執行,是平臺相關的。

因此,當解釋執行時,Java程式速度更慢。

Java語言支援多執行緒,允許併發執行緒的同步與互斥操作。

  C++則沒有這種內在機制

可以將Java程式的內容和結構轉換成HTML格式的文件。