可能重复:
类型名称后的括号是否与 new 不同?
我看到有人使用这样的构造函数:
class Foo
{
public: Foo();
};
int main(){
Foo *f= new Foo;
}
Foo *f= new Foo;
和有什么区别Foo *f= new Foo();
?
可能重复:
类型名称后的括号是否与 new 不同?
我看到有人使用这样的构造函数:
class Foo
{
public: Foo();
};
int main(){
Foo *f= new Foo;
}
Foo *f= new Foo;
和有什么区别Foo *f= new Foo();
?
这两种初始化形式之间没有区别。两者都将调用默认构造函数,假设构造函数是public
.
Ỳ我们的示例甚至可能无法编译,您需要声明一个指针
Foo *f = new Foo;
并且键入没有区别,new Foo
或者new Foo()
因为两者都在没有参数的情况下运行构造函数。
首先,您提供的代码将无法编译。你需要有
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() 语法。