只是一個簡單的問題。正如標題所示,我只使用「new」運算符來創建一個類的新實例,所以我想知道另一種方法是什麼以及如何正確使用它。創建一個沒有「新」操作符的類的新實例
回答
你也可以有你的類自動情況下,不使用new
,如:
class A{};
//automatic
A a;
//using new
A *pA = new A();
//using malloc and placement-new
A *pA = (A*)malloc(sizeof(A));
pA = new (pA) A();
//using ONLY placement-new
char memory[sizeof(A)];
A *pA = new (memory) A();
最後兩正在使用placement-new,與新略有不同。 placement-new用於通過調用構造函數來構造對象。在第三個例子中,malloc
只分配內存,它不調用構造函數,這就是爲什麼使用placement-new來調用構造函數來構造對象。
另請注意如何刪除內存。
//when pA is created using new
delete pA;
//when pA is allocated memory using malloc, and constructed using placement-new
pA->~A(); //call the destructor first
free(pA); //then free the memory
//when pA constructed using placement-new, and no malloc or new!
pA->~A(); //just call the destructor, that's it!
要知道什麼是投放新的,閱讀這些常見問題解答:
- What is "placement new" and why would I use it?(在parashift.com FAQ)
- placement new(在stackoverflow.com FAQ)
你可以只申報一個普通變量:
YourClass foo;
假設它有一個默認的構造函數。 – Nick 2011-05-04 15:14:40
我在哪裏可以找到關於「正常變量」的更多信息? – 2016-01-05 13:03:54
不應使用new創建C++中的大多數對象。當你需要創建的對象的數量
class Person {
...
};
int main() {
int x = 3;
boolean b = true;
Person p("fred");
}
創建新的對象應保留的場合,當你需要多態,或可能:相反,你應該以同樣的方式,你將創建整數或布爾創建它們,但在編譯時你不知道有多少。
不,關於如何創建對象的決定取決於對象應該生存多長時間。如果它只存在於給定函數的範圍和生命週期內,那麼將其作爲一個'auto'局部變量是有意義的。如果它必須存在於函數執行之外,則需要動態分配。還有的創建多少個對象的問題,即,而是具有單個實例它們的列表或數組。 – 2011-05-04 15:20:31
一點也不 - 我可以在一個函數創建一個實例,並通過複製,它返回到調用函數,我會爲一個整數的一個實例。做你寫的回報的std ::字符串通過指針返回它們的全部功能? – 2011-05-04 15:23:11
這聽起來像你真的喜歡複製對象... – 2013-06-30 20:52:46
使用malloc會給你新的結果,只是不調用構造函數。
不完全錯誤的,所以沒有-1 ...這隻有在構造函數什麼都不做類沒有任何虛方法有點正確? – 2011-05-05 04:48:29
任何常用的方法:作爲本地或靜態變量,或作爲臨時的。一般而言,當對象具有標識並且生命週期不對應於作用域或其多態時,在C++中使用new
的唯一時間爲 。 (當然有 例外,但不是很多。)如果對象可以複製 ,通常最好使用本地實例,根據需要複製 。 (就像你會爲int
,其實。)
- 1. C++新操作符。創建一個新實例
- 2. 創建一個新的類實例
- 3. 實例化一個沒有「新」的類
- 4. 如何在沒有新操作員的情況下創建新實例?
- 5. 創建同一類型的新實例作爲另一個intsance
- 6. Python沒有創建一個新的乾淨實例?
- 7. 維護一個DAO類實例池與做新操作符
- 8. @GeneratedValue當創建一個新的實例
- 9. CRM創建一個CrmConnection的新實例
- 10. 創建一個新的weka實例
- 11. 創建一個新的堆棧操作
- 12. 在scala中動態創建一個案例類的新實例
- 13. ExecutorService - 在方法中創建新實例vs每個類創建一個實例
- 14. 基於現有實例創建類的新實例
- 15. 有沒有使用新的創建一個實例的另一種方法?
- 16. 創建一個COM互操作類的實例
- 17. Java中,一個類的多個實例重置最新創建的實例
- 18. 創建類的新的實例,作爲字符串和更新設置方法
- 19. 有沒有創建它的實例有一個類可以嗎?
- 20. 在Android中創建新類的實例
- 21. 在另一個私有類中創建私有類的新實例
- 22. 創建一個n最常見的類型的新實例
- 23. 是否有一個call_user_func()等同於創建一個新的類實例?
- 24. 創建KClass的新實例
- 25. 使用類類的一個對象來創建一個新的實例
- 26. 在打字稿中創建一個類的新實例
- 27. 使用變量創建一個[泛型類型]的新實例
- 28. 如何在處理中創建一個類的新實例
- 29. 在Java中主要創建同一個類的新實例
- 30. 如何從其基類的實例創建一個新對象?
+1:我想知道*不是動態分配*的正確術語是什麼。 *自動* - 謝謝! – 2011-05-04 15:16:34
此外,要了解使用自動實例的優點,您需要了解[RAII](http://stackoverflow.com/questions/712639/)。 – 2011-05-04 15:20:51
'auto'變量有時也被稱爲'stack'變量。有多少程序員實際上使用'auto'關鍵字? – 2011-05-04 15:23:44