C++與Java的文法區別
首先,兩個大的不同是主函數和怎樣編譯的不同,接下來是許多小的區別。
main 函數
C++
//自由浮動的函數
int main( int argc, char* argv[])
{
printf( "Hello, world" );
}
Java
// 每個函數都必須是一個類的一部分;當java <class>運行是一個特定類的主函數會被調用
// (因此你可以讓每個類都有一個main函數,這在寫單元測試是很有用)
class HelloWorld
{
public static void main(String args[])
{
System.out.println( "Hello, World" );
}
}
類的聲明
除了 Java 不要求用分號外幾乎是相同的。
C++
class Bar {};
Java
class Bar {}
方法聲明
都相同的, 除了在Java,方法必須總是 某個類的一部分並且可能public/private/protected 作為修飾
建構函式和解構函式
建構函式都是相同的 (即類的名字), Java沒有準確意義上的的解構函式
靜態成員函數和變數
方法聲明是相同的, 但 Java 提供靜態初始化塊來來初始化靜態變數 (不需要在源檔案中聲明):
class Foo
{
static private int x;
// 靜態初始化塊
{ x = 5; }
}
對象的聲明
C++
// 在棧中
myClass x;
//或者在堆中
myClass *x = new myClass;
Java
// 總是在對堆中聲明
myClass x = new myClass();
繼 承
C++
class Foo : public Bar
{ ... };
Java
class Foo extends Bar
{ ... }
存取層級 (abstraction barriers)
C++
public:
void foo();
void bar();
Java
public void foo();
public void bar();
虛函數
C++
virtual int foo(); // 或者非虛函數寫作 int foo();
Java
// 函數預設的就是虛函數; 用final關鍵字防止重載
int foo(); // 或者, final int foo();
記憶體管理
大體上是相同的--new 來分配, 但是 Java沒有 delete,因為它有記憶體回收行程。
NULL vs null
C++
// 初始化一個指標為 NULL
int *x = NULL;
Java
// 編譯器將捕獲使用未初始化的引用
//但是如果你因需要初始化一個引用而賦一個null,那麼這是無效的
myClass x = null;
布爾型
Java有一點羅嗦: 你必須寫 boolean而不止是 bool.
C++
bool foo;
Java
boolean foo;
常 量
C++
const int x = 7;
Java
final int x = 7;
拋異常
首先,Java在編譯器強制拋異常—如果你的方法可能會拋異常你必需明確報告
C++
int foo() throw (IOException)
Java
int foo() throws IOException
數 組
C++
int x[10];
// 或
int *x = new x[10];
// 使用 x,然後歸還記憶體
delete[] x;
Java
int[] x = new int[10];
// 使用 x, 記憶體有記憶體回收行程回收或
//或在程式生命週期盡頭歸還給系統
集合和迭代器
C++
迭代器是類的成員。範圍的開始是<容器>.begin(), 結束是 <容器>.end()。 用++ 操作符遞增, 用 *操作符訪。
vector myVec;
for ( vector<int>::iterator itr = myVec.begin();
itr != myVec.end();
++itr )
{
cout << *itr;
}
Java
迭代器只是一個介面。 範圍的開始是 <集合>.iterator,你必須用itr.hasNext()來查看是否到達集合尾。 使用itr.next()(是在C++中使用操作符++ 和*操作的結合)來獲得下一個元素。
ArrayList myArrayList = new ArrayList();
Iterator itr = myArrayList.iterator();
while ( itr.hasNext() )
{
System.out.println( itr.next() );
}
// 或, 在Java 5中
ArrayList myArrayList = new ArrayList();
for( Object o : myArrayList ) {
System.out.println( o );
}
抽象類別
C++
// 只需要包含一個純虛函數
class Bar { public: virtual void foo() = 0; };
Java
// 文法上允許顯示的聲明!
abstract class Bar { public abstract void foo(); }
// 或者你也可以聲明一個介面
interface Bar { public void foo(); }
// 然後讓一個類繼承這個介面:
class Chocolate implements Bar
{
public void foo() { /* do something */ }
}
引用 vs 指標
C++
//引用不可改變,通過使用指標來獲得更多的靈活性
int bar = 7, qux = 6;
int& foo = bar;
Java
// 引用是可變的,僅儲存物件地址;
//沒有指標類型
myClass x;
x.foo(); // error, x is a null ``pointer''
// 注意你要總是用 . 來訪問域
編 譯
C++
// 編譯
g++ foo.cc -o outfile
// 運行
./outfile
Java
// 編譯foo.java檔案中的類成<classname>.class javac foo.java
// 通過調用<classname>中的靜態main方法來運行
java <classname>
注 釋
兩種語言是一樣的 (// 和 /* */ 可以用)