C 建立類物件時(無參)後不加括號與加括號的區別

2021-08-21 05:48:59 字數 2226 閱讀 5299

在不考慮用new動態建立物件的情況下,用最普通的

類名 物件名(引數);

的方法建立物件

先貼上最正常最普通的**

#includeusing

namespace

std;

class

c; c(

intm);

private

:

intn;

};int

main()

ok,現在我們看看執行結果:

ok,預期地執行了第乙個建構函式。但如果我們在建立物件時不用原來的句子:

c c;

而是在物件名後面加():

c c();

那會成怎樣呢?

修改後**:

沒有執行建構函式!也就是說根本就沒有在記憶體中建立物件,只是建立了乙個「物件名」!

如果建立時給它賦乙個引數:

ok,一切正常。

所以,現在問題就很清楚了,當我們以以下形式建立類物件時:

i)類名 物件名

預設呼叫「物件名()」這個建構函式,在棧記憶體中存在物件名,在堆記憶體中存在實際物件;

ii)類名 物件名(乙個或以上個引數)

預設呼叫相應的建構函式,在棧記憶體中存在物件名,在堆記憶體中也是存在實際物件的;

iii)類名 物件名()

不呼叫任何建構函式建立物件,其實是宣告了乙個函式而已

#include 

class

myclass  

public

:  void

mymethod()   

};  

如果這樣定義物件:myclass obj; 那麼它的建構函式將會被執行,如果呼叫obj.mymethod();也會執行正確。

可是如果帶有括號:myclass obj(); 那麼它的建構函式不會被執行,呼叫obj.mymethod();也會出現語法錯誤,請問這種語法是把obj定義成什麼了?

myclass obj()把obj定義成什麼 從語法上看是定義了乙個名為obj,型別為myclass類(也就是返回值為myclass型別)的無引數函式。

另外如果進行動態的堆分配的話是要帶括號的,比如 myclass *obj = new myclass() 不加會報錯(但是,在vc6.0中不加()並沒有報錯,而且結果是一樣的,原因待解?但是有一條,如果類中定義了帶引數的建構函式,定義類時不用括號肯定是錯誤的#add  為避免錯誤,統一加括號

c++建立物件的語法有—–

1 在棧上建立 myclass a;

2 在堆上建立加括號 myclass *a= new myclass();

3 不加括號 myclass *a = new myclass;

4.—————myclass a();宣告了乙個返回值為myclass型別的無參函式。

C 建立物件時加括號與不加括號的區別

看到一篇文章對建立物件時的集中情況,梳理得很清楚 c 建立物件的語法有 1 在棧上建立 myclass a 2 在堆上建立加括號 myclass a new myclass 3 不加括號 myclass a new myclass 也是在對上建立,並且有乙個自定義型別指標指向myclass 4.my...

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

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

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

include using namespace std 空類 class empty 乙個預設建構函式,乙個自定義建構函式 class base base int nvalue private int m nvalue 乙個復合預設建構函式 class custom private int m nv...