1

可能重复:
类型名称后的括号是否与 new 不同?

我看到有人使用这样的构造函数:

class Foo
{
  public: Foo();
};

int main(){
  Foo *f= new Foo;
}

Foo *f= new Foo;和有什么区别Foo *f= new Foo();

4

3 回答 3

2

这两种初始化形式之间没有区别。两者都将调用默认构造函数,假设构造函数是public.

于 2011-12-20T08:35:45.297 回答
1

Ỳ我们的示例甚至可能无法编译,您需要声明一个指针

 Foo *f = new Foo;

并且键入没有区别,new Foo或者new Foo()因为两者都在没有参数的情况下运行构造函数。

于 2011-12-20T08:38:10.637 回答
1

首先,您提供的代码将无法编译。你需要有

Foo* f = new Foo()

注意星号。

否则,对于非原始类型,这两个调用具有相同的结果。我曾在风格指南强制执行 () 语法的公司工作,这是有充分理由的:对于原始类型,可能存在差异:

int* p = new p;
cout << *p << endl; // the value is arbitrary i.e. behavior is undefined.
int* q = new int();
cout << *q << endl; // outputs 0.

在这里可能很明显,但想象一下 Foo 是一个 typedef 例如。所以我的建议是:始终使用 Foo() 语法。

于 2011-12-20T08:43:08.907 回答