C++與Java的文法區別

來源:互聯網
上載者:User
  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>
   
注   釋
兩種語言是一樣的 (// 和 /* */ 可以用)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.