new 對象加括號和不加括號的區別

在new對象的時候有加上(),有不加(),不知道這個到底是什麼區別?
比如:

CBase *base = new CDerived();

CBase *base = new CDeviced;

很多人都說,加括號調用沒有參數的構造函數,不加括號調用默認構造函數或唯一的構造函數。這是有問題的。

對於自定義類類型:

       如果該類沒有定義構造函數(由編譯器合成默認構造函數)也沒有虛函數,那麼class c = new class;將不調用合成的默認構造函數,而class c = new class();則會調用默認構造函數。

       如果該類沒有定義構造函數(由編譯器合成默認構造函數)但有虛函數,那麼class c = new class;和class c = new class();一樣,都會調用默認構造函數。

       如果該類定義了默認構造函數,那麼class c = new class;和class c = new class();一樣,都會調用默認構造函數。

對於內置類型:

       int *a = new int;不會將申請到的int空間初始化,而int *a = new int();則會將申請到的int空間初始化爲0。

 以下兩個語句的區別是:第一個動態申請的空間裏面的值是隨機值,第二個進行了初始化,裏面的值爲0:

int *p1 = new int[10];

int *p2 = new int[10]();

結論:別使用不帶括號的new。

class A{

public:

//A(){a=1;}

public:

int a;

};

A *a1=new A;

A *a2=new A();


cout<<a1->a<<endl; //輸出:-842150451

cout<<a2->a<<endl; //輸出0

A a3;

cout<<a3.a<<endl; //運行異常,a沒有初始化。

如果加上一個virtual,如virtual ~A(){},

cout<<a1->a<<endl; //輸出:-842150451

cout<<a2->a<<endl; //輸出 -842150451

-------------下面是網上找的帖子,對理解上面的現象可能會有幫助-------------------

一個類滿足下列其中任何一個條件:
1.包含了一個類的對象,這個對象有一個構造函數(包括編譯器合成的默認構造函數)
2.如果繼承自一些基類,其中某些基類有一個構造函數(包括編譯器合成的默認構造函數)
3.有一個虛函數,或者繼承到了虛函數
4.有虛基類

如果這個類沒有默認的構造函數,編譯器就會合成一個默認的構造函數,分別做以下事情
如果這個類有構造函數,編譯器就會擴張所有構造函數,做以下事情
1.調用這個對象的構造函數
2.調用基類的構造函數
3.設置正確的虛函數表指針
4.設置指向虛基類對象的指針

參考鏈接:https://blog.csdn.net/eldn__/article/details/41963727

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章