在C++中,「新」是運算符還是表達式或某種關鍵字?一個類似的問題是,我應該叫'='一個操作符還是表達式?內存分配操作符和表達式
回答
新是運營商。你可以重載它並編寫你自己的版本。另外我認爲=是運營商。表達式是由操作符,變量,函數調用等組成的更爲複雜的事情,請儘量獲取C++語言標準。它必須描述你提到的所有事情。
也許你可以引用標準中的某些內容來支持*你的*答案。 – quasiverse
我還聽到術語賦值表達式,你能提供一些例子嗎?謝謝。 – Cuio
這實際上並不正確。 new *表達式中最常遇到'new'。 –
C++分離了內存分配和對象生命週期的概念。與C相比,這是一個新特性,因爲在C中,一個對象與其內存表示(在C++中稱爲「POD」)是等價的。
一個對象在構造函數完成時開始其生命,並且當析構函數完成時它的生命結束。對於動態存儲持續時間的對象,生命週期因此由四個關鍵里程碑組成:
- 內存分配。
- 對象構造。
- 對象破壞。
- 內存釋放。
C++中動態分配內存的標準方式是使用全局的::operator new()
和取消分配::operator delete()
。然而,爲了構造的對象只有一個方法:甲新表達:
T * p = new T;
這最常見的新的表現形式做在一個步驟中分配和施工。這相當於細分版本:
void * addr = ::operator new(sizeof(T));
T * p = new (addr) T; // placement-new
同樣,刪除表達delete p;
首先調用析構函數,然後釋放內存。它相當於此:
p->~T();
::operator delete(addr);
因此,默認新和刪除表達式在一個洗滌執行存儲器分配和對象構造。所有其他形式的新表達式統稱爲「放置新的」,調用相應的放置 - 新的運算符在構建對象之前分配內存。但是,沒有匹配的「放置刪除表達式」,並且使用放置新創建的所有動態對象都必須用p->~T();
手動銷燬。
總之,區分新表達與運營商新是非常重要的。這真的是C++內存管理的核心。
這些都是這些。
2.13表4明確列出了new
作爲關鍵字。
5.3.4引入new-expression
。這是一個表達式,例如new int(5)
,它使用new
關鍵字,一個類型和一個初始值。
5.3.4/8然後指出operator new
被調用,以用於由新表達
=
創建的對象分配存儲器的工作原理完全相同。每個類都有一個operator=
(除非明確刪除),它在賦值表達式中使用。即使在技術上「我們通常稱a=5;
是一個包含賦值表達式的表達式語句」,我們通常也會調用a=5;
。
- 1. C++新操作符分配新內存
- 2. 操作系統內存分配
- 3. 連續的'新'操作符是否連續分配內存?
- 4. 堆上內存分配的新操作符
- 5. Struts2操作正則表達式/通配符URL
- 6. 如何分解表達式涉及按位移操作符? Swift
- 7. 模式匹配和字符串操作
- 8. C字符串內存分配隱式?
- 9. 正則表達式 - 在括號內僅匹配分隔符
- 10. 操作CRON表達式
- 11. 正則表達式分組和匹配
- 12. 分配列表操作VAR
- 13. 使用正則表達式和規則的字符串操作
- 14. 與字符串操作和正則表達式
- 15. 正則表達式和字符串操作
- 16. Lambda表達式和內存管理
- 17. 字符內存分配
- 18. 字符串內存分配
- 19. Swift正則表達式和分隔符
- 20. SSIS表達式通配符
- 21. Ç - 內存分配和釋放內存
- 22. 帶列表操作的Lambda表達式
- 23. Python列表操作,Lambda表達式
- 24. 結合正則表達式模式來匹配組分隔字符串內
- 25. 模板和內存分配
- 26. malloc分配內存和SIGSEGV
- 27. int char *和內存分配
- 28. JSON樹和內存分配
- 29. Enumerable.Range和內存分配
- 30. 分配和釋放內存
他們是運營商 – slartibartfast
投票關閉:不是一個真正的編程問題。 –
@Oli,怎麼樣?這是關於編程語言的語義的一個具體的可回答的問題。 – Joe