什么是两者之间的区别?
int * num = new (int);
并且
int * num = new int;
有什么区别吗?
编辑 谢谢大家。...哪个答案是最正确的?
什么是两者之间的区别?
int * num = new (int);
并且
int * num = new int;
有什么区别吗?
编辑 谢谢大家。...哪个答案是最正确的?
在您的示例中(使用int类型),上下文中没有区别。但是,如果您需要创建复合类型的对象,则需要使用括号版本。例如:
int (**fn_ptr_ok) () = new (int (*[10]) ()); // OK
int (**fn_ptr_err) () = new int (*[10]) (); // error
当您想创建动态数组时,还有另一个区别。
int n = 2;
int *p = new int[n]; // valid
int *q = new (int[n]); // invalid
delete[]
,是吗? - CB Baileydelete[]
。 - Johannes Schaub - litbn
是常量,那么第二个就相当于为一个对象(而不是 n 个)分配空间,该对象具有与 int arr[n]
完全相同的类型?对吗? - UmmaGumman
是常量,与第一个完全等效。它只需要n
是常量。在这两种情况下,都创建了一个对象(数组对象),其中包含n
个对象。在这方面,括号没有不同的含义。 - Johannes Schaub - litb虽然这不是一个答案,但我无法将其放入评论中。
由于“placement new”的存在,它变得更加复杂: 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;
}
有趣的是gcc可以接受这个,但MS/Intel不行。
new
的含义是相同的。从语法上讲,前者new ()
的操作数是类型标识符,而后者的操作数是新类型标识符。对于新类型标识符,如果(....)
出现在操作数的后面,则被解释为构造函数的参数列表。也就是说,如果我们写new int(1)
,那么int
将被初始化为1。另一方面,对于类型标识符,如果(....)
出现,则它是类型的一部分。例如,当我们new
一个指向函数的指针时,我们必须使用new( type-id )
形式。例如,如new( int(*)() )
。