2016-02-15 88 views
1

假設我有兩個類。 Class1Class2的實例作爲初始化的參數。那麼下面兩行代碼之間有什麼區別?C++,類成員

據我所知,當您使用new時,會創建一些內存空間,您應該使用delete擦除該內存。那麼說在這種情況下第一次使用是不是標準的呢?

Class1 c1(new Class2(argu)); 

Class1 c1(Class2(argu)); 
+1

這兩個聲明需要不同的原型開始。 –

+0

我想補充說第一個版本是Java風格。在C++中,除非你在構造函數中,否則使用「new」會被認爲是不好的樣式。有關更多信息穀歌「RAII」。 –

回答

1

Class1 c1(new Class2(argu));

new運營商分配的heap一個Class2 object,你必須記住delete它時,它不再使用,否則會出現內存泄漏。它將調用Class1(Class2 *p)構造函數。從技術上講,你的構造函數將不得不存儲該指針以便稍後刪除它。

Class1 c1(Class2(argu));

這行創建一個臨時對象Class2,而且會一直嘗試調用構造函數Class1(Class2&& c)首先接受臨時Class2對象。

如果你沒有,它會調用Class1(Class2& c) [按參考]或Class1(Class2 c) [按值](你只能同時有一個)。

+0

或'Class1(Class2 c)'... – kfsone

0

new在堆上分配一個新的實例,並返回一個指針。爲了接受它,你的構造函數應該定義爲Class1(Class2*)。第二個片段在堆棧上聲明一個新實例,並可通過參考Class1(Class2&)進行消耗。

0

那麼,什麼是以下兩個代碼的區別?

這取決於如何實現Class1的構造函數。第一個建設要成功;

Class1::Class1(Class2* arg); 

Class1需要接受由指針參數(可能可能const以及)。需要進一步的文檔來確定參數是否應該是new ed或者它是否只是期望指針(如果使用更多的C風格)。最有可能的是,用現代慣用的C++,它需要new

第二個構造函數需要一個引用或值;

Class1::Class1(const Class2& arg); // lvalue ref 
Class1::Class1(Class2&& arg); // rvalue ref 
Class1::Class1(Class2 arg); // value 

第一種形式是一個拷貝構造,第二個是一個移動的構造,都將結合到所創建的臨時Class2對象。第三種形式是有價值的,也會適當地加以約束。

那麼說在這種情況下第一次使用是不是標準的安全嗎?

根本不是。如果Class1構建爲Class2資源的RAII類型,那麼此表單就是您所期望的。

請注意,在new的情況下,有人需要調用相應的delete以確保該類被破壞並釋放內存。