Java與C++關(guān)于構(gòu)造函數(shù)的差異

case1

Java:

class A {
    public A() {
        System.out.println("A~~~~~~~~~~~~~~~~~~~~~~~");
    }
}
class B {
    public B() {
        System.out.println("B~~~~~~~~~~~~~~~~~~~~~~~");
    }
    A a;
}

C++:

class A{
public:
    A(){
        cout<<"A~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    }
};
class B{
public:
    B(){
        cout<<"B~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    }
    A a;
};

C++輸出為:

A~~~~~~~~~~~~~~~~~~~~~~~
B~~~~~~~~~~~~~~~~~~~~~~~

Java輸出為:

B~~~~~~~~~~~~~~~~~~~~~~~

這個(gè)例子體現(xiàn)了C++在Java的細(xì)節(jié)差異:

Java:
  1. 在Java中primitive types為值語義,
  2. 非class 對象都是對象語義/引用語義,Java只能通過以下方式進(jìn)行實(shí)例化
    • new
    • 使用反射,newInstance
    • 對象的clone方法
    • 某些類提供的工廠方法或通過反序列化等

而顯然上面的代碼中a并沒有實(shí)例化,只是個(gè)空指針。

C++:

上面代碼對Java來說答案非常簡單,對C++代碼很多人第一直覺B的構(gòu)造函數(shù)沒有什么特別,只是打印B,那為什么會輸出A的信息呢?
原因是此時(shí)如果類有多個(gè)成員變量,那么構(gòu)造函數(shù)會按照成員變量聲明的順序來調(diào)用成員變量的默認(rèn)構(gòu)造函數(shù)。

case2

Java:

class A {
    public A() {
        System.out.println("A~~~~~~~~~~~~~~~~~~~~~~~");
    }
}
class B extends A{
    public B() {
        //super(); 不顯示寫super(),也會調(diào)用父類構(gòu)造
        System.out.println("B~~~~~~~~~~~~~~~~~~~~~~~");
    }
}

C++:

class A{
public:
    A(){
        cout<<"A~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    }
};
class B : A{
public:
    B(){
        cout<<"B~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    }
};

在繼承鏈上的構(gòu)造函數(shù),C++與Java的表現(xiàn)都是一樣的,都是先構(gòu)造父類,然后構(gòu)造子類。

case3

委托構(gòu)造,在C++11前構(gòu)造函數(shù)不能相互調(diào)用,而在C++11中提供了委托構(gòu)造(構(gòu)造函數(shù)可以調(diào)用其他構(gòu)造函數(shù))的支持。在Java天然提供支持
Java:

class B extends A{
    public B() {
        System.out.println("B~~~~~~~~~~~~~~~~~~~~~~~");
    }
    public B(int x) {
        this();
        System.out.println(x);
    }
}

C++:

class B:A{
public:
    B(){
        cout<<"B~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    }
    B(int x) : B(){
        cout<<x<<endl;
    }
};

WalkeR_ZG

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容