關於c 建構函式的問題?

時間 2021-06-05 10:00:55

1樓:Acjx

A*pnt1

=newA;

A*pnt2

=new

A();

對於C++03標準來說,new A()一定是進行值初始化(value initialize),分為3種情況,如下:

1. 如果A是標量型別(例如:bool,int,char,double,指標)的話,A進行的是zero-initialize,也就是用0來初始化;

2. 如果A是非POD的普通類型別的話,則A()呼叫預設建構函式來進行初始化。

3. 如果A是POD類型別,通常編譯器不會為A生成預設建構函式,那麼A()值初始化時,其資料成員分別進行值初始化(聯絡1)。

對於 new A 來說,情況如下:

1. 如果A是標量型別(例如:bool,int,char,double,指標)的話,A沒有被初始化,產生未定義的值。

2. 如果A是非POD的普通類型別的話,則A呼叫預設建構函式來進行初始化。

3. 如果A是POD類型別,其資料成員並未進行初始化,產生未定義的值。

2樓:Clones

編譯器並不總是產生預設建構函式,也不是所有產生的預設建構函式都是non-trivial的。

具體參見《深度探索C++物件模型》

3樓:鍾宇騰

A*pnt1

=newA;

A*pnt2

=new

A();

這兩個呼叫是有區別的。

如果``class A``定義了乙個預設建構函式的話,那麼這兩句沒有區別。否則,上面一句呼叫就不會初始化普通型別(int, double之類的POD型別)值;而下面一句就會用預設值初始化它們。

Reference:

Do the parentheses after the type name make a difference with new?

4樓:柯煦

C++的類建構函式沒有義務初始化每乙個基本變數。整形和浮點值會被初始化為任意值(什麼都有可能,0也有可能),而成員類的預設建構函式會被依次呼叫。你試試多執行幾次程式,看看結果有沒有變化?

另外你的編譯環境和作業系統是什麼?

c 類的建構函式初始化問題??

Right If you don t specify any constructors,the compiler will write one for you that doesn t take any arguments.This compiler generated default constr...

C 的建構函式與析構函式?

關於C 的問題,你的心中要有兩個概念,乙個是記憶體的分配,二是記憶體的初始化。C 的建構函式有兩個作用 第一,你必須要有乙個建構函式,compiler才會去給你分配記憶體。第二,分配了記憶體之後,再用建構函式去初始化記憶體。函式體為空,因為類中的每乙個成員都有預設建構函式和析構函式 否則是無法編譯的...

C 中,既然有了建構函式, 那麼拷貝建構函式存在的意義是?

白白小白 copy constructor 建立物件的時候,用同一類的物件對它進行初始化的時候會自動呼叫拷貝建構函式。Aa Ab a 或者傳參Ab f b 或者返回值是物件Af 語法 public A constA a 我們首先希望傳參的時候不會對原來的物件產生修改,所以使用了const型別 避免迴...