2011-03-18 256 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。

相关问题