假設我有兩個類。 Class1
以Class2
的實例作爲初始化的參數。那麼下面兩行代碼之間有什麼區別?C++,類成員
據我所知,當您使用new
時,會創建一些內存空間,您應該使用delete
擦除該內存。那麼說在這種情況下第一次使用是不是標準的呢?
Class1 c1(new Class2(argu));
Class1 c1(Class2(argu));
假設我有兩個類。 Class1
以Class2
的實例作爲初始化的參數。那麼下面兩行代碼之間有什麼區別?C++,類成員
據我所知,當您使用new
時,會創建一些內存空間,您應該使用delete
擦除該內存。那麼說在這種情況下第一次使用是不是標準的呢?
Class1 c1(new Class2(argu));
Class1 c1(Class2(argu));
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)
[按值](你只能同時有一個)。
或'Class1(Class2 c)'... – kfsone
new
在堆上分配一個新的實例,並返回一個指針。爲了接受它,你的構造函數應該定義爲Class1(Class2*)
。第二個片段在堆棧上聲明一個新實例,並可通過參考Class1(Class2&)
進行消耗。
使用new分配用於第一行指針的動態內存。第二行聲明一個新的實例。
你也許可以在動態內存分配念起來也類 http://www.cplusplus.com/doc/tutorial/dynamic/
那麼,什麼是以下兩個代碼的區別?
這取決於如何實現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
以確保該類被破壞並釋放內存。
這兩個聲明需要不同的原型開始。 –
我想補充說第一個版本是Java風格。在C++中,除非你在構造函數中,否則使用「new」會被認爲是不好的樣式。有關更多信息穀歌「RAII」。 –