new 物件加括號和不加括號的區別

2021-09-25 03:34:31 字數 1189 閱讀 1003

在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:

int a;

};a *a1=new a;

a *a2=new a();

cout則cout乙個類滿足下列其中任何乙個條件:

1.包含了乙個類的物件,這個物件有乙個建構函式(包括編譯器合成的預設建構函式)

2.如果繼承自一些基類,其中某些基類有乙個建構函式(包括編譯器合成的預設建構函式)

3.有乙個虛函式,或者繼承到了虛函式

4.有虛基類

如果這個類沒有預設的建構函式,編譯器就會合成乙個預設的建構函式,分別做以下事情

如果這個類有建構函式,編譯器就會擴張所有建構函式,做以下事情

1.呼叫這個物件的建構函式

2.呼叫基類的建構函式

3.設定正確的虛函式表指標

4.設定指向虛基類物件的指標

Python呼叫函式加括號和不加括號的區別

一 不帶括號時,呼叫的是這個函式本身 是整個函式體,是乙個函式物件,不須等該函式執行完成 二 帶括號 引數或者無參 呼叫的是函式的執行結果,須等該函式執行完成的結果 coding utf 8 def bracket data return data if name main 不帶括號呼叫的結果 a是...

new 乙個物件的時候加括號和不加括號有什麼區別

先看以下 include using namespace std int main delete a int b new int 1000 for int i 0 i 100 i delete a int b new int 1000 for int i 0 i 100 i main函式中使用語句 ...

new物件時,類名後加括號與不加括號的區別

預設建構函式 關於預設建構函式,請參見隨筆 類中函式 請看測試 1 include 2 using namespace std 34 空類 5class empty6 89 乙個預設建構函式,乙個自定義建構函式 10class base11 18 base int nvalue 19 2324 pr...