2011-03-18 260 views

回答

14

沒有(使用INT型)在您的示例的上下文中的差。 但是,如果您需要創建複合類型的對象,則需要使用加括號的版本。即:

int (**fn_ptr_ok)() = new (int (*[10])()); // OK 
int (**fn_ptr_err)() = new int (*[10])(); // error 
+0

這是指向函數的10個指針的數組(返回int並且不帶參數)。看看這個:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html – sinek 2011-03-23 08:20:06

10

對於這種特殊的情況下,沒有什麼不同。兩者都是一樣的。只是第一個語法很少被使用,可能是因爲它看起來不方便和神祕,而且需要更多的輸入!

2

在這個問題上的情況下,這兩個new S的含義是相同的。 在語法上,前者形式new()的操作數的類型-ID, 和後者的操作數是新型-ID。 至於新型-ID,如果(....)出現在操作數的後面,它 解釋爲構造函數的參數列表。 也就是說,如果我們編寫new int(1)int初始化爲1. 另一方面,對於type-id,如果出現(....),則它是該類型的一部分。 例如,當我們new的指針的函數,我們必須使用 new(type-id)形式。 例如,new(int(*)())

+1

我想我明白你在說什麼。我對我的思維閱讀技能感到很自豪。 – log0 2011-03-18 09:49:31

6

還有一個區別,當你想創建一個動態數組

int n = 2; 
int *p = new int[n]; // valid 
int *q = new (int[n]); // invalid 

括號內的版本需要一定的大小。

+1

對於第二個,你仍然需要使用'delete []',是嗎? – 2011-03-18 12:05:49

+0

@Charles是你需要使用'delete []'。 – 2011-03-18 12:09:53

+0

所以如果'n'是常數,第二個等於爲ONE對象(NOT n)分配空間,它與'int arr [n]'具有完全相同的類型?對? – UmmaGumma 2011-03-20 11:36:42

1

(不是一個真正的答案,但我不能把它變成註釋)

它更加複雜,因爲「新位置」: http://codepad.org/pPKt31HZ

#include <stdio.h> 

void* operator new(size_t N, int x) { 
    return new char[N]; 
} 

int main(void) { 
    int x = int(); 
    int* a = new(int()) int; 
} 

這裏的有趣的是,海灣合作委員會接受這一點,但不是MS/Intel。

相關問題