2011-09-22 39 views
3

在C++中,「新」是運算符還是表達式或某種關鍵字?一個類似的問題是,我應該叫'='一個操作符還是表達式?內存分配操作符和表達式

+0

他們是運營商 – slartibartfast

+0

投票關閉:不是一個真正的編程問題。 –

+0

@Oli,怎麼樣?這是關於編程語言的語義的一個具體的可回答的問題。 – Joe

回答

2

新是運營商。你可以重載它並編寫你自己的版本。另外我認爲=是運營商。表達式是由操作符,變量,函數調用等組成的更爲複雜的事情,請儘量獲取C++語言標準。它必須描述你提到的所有事情。

+0

也許你可以引用標準中的某些內容來支持*你的*答案。 – quasiverse

+0

我還聽到術語賦值表達式,你能提供一些例子嗎?謝謝。 – Cuio

+0

這實際上並不正確。 new *表達式中最常遇到'new'。 –

6

C++分離了內存分配和對象生命週期的概念。與C相比,這是一個新特性,因爲在C中,一個對象與其內存表示(在C++中稱爲「POD」)是等價的。

一個對象在構造函數完成時開始其生命,並且當析構函數完成時它的生命結束。對於動態存儲持續時間的對象,生命週期因此由四個關鍵里程碑組成:

  1. 內存分配。
  2. 對象構造。
  3. 對象破壞。
  4. 內存釋放。

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++內存管理的核心。

3

這些都是這些。

2.13表4明確列出了new作爲關鍵字。

5.3.4引入new-expression。這是一個表達式,例如new int(5),它使用new關鍵字,一個類型和一個初始值。

5.3.4/8然後指出operator new被調用,以用於由新表達

=創建的對象分配存儲器的工作原理完全相同。每個類都有一個operator=(除非明確刪除),它在賦值表達式中使用。即使在技術上「我們通常稱a=5;是一個包含賦值表達式的表達式語句」,我們通常也會調用a=5;