类型名称后面的括号与新的有什么不同?
如果'测试'是一个普通的类,是否有任何区别:
Test* test = new Test;
和
Test* test = new Test();
让我们讨厌,因为实际上会影响代码行为的差异。 以下大部分内容摘自对“旧新事物”文章的评论。
有时,新运算符返回的内存将被初始化,有时它不会取决于新建的类型是POD(普通旧数据),还是包含POD成员的类,并且正在使用编译器生成的默认构造函数。
承担:
struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
在C ++ 98编译器中,应该发生以下情况:
new A
- 不确定的价值 new A()
- 零初始化
new B
- 默认构造(B :: m未初始化)
new B()
- 默认构造(B :: m未初始化)
new C
- 默认构造(C :: m是零初始化的)
new C()
- 默认构造(C :: m是零初始化的) 在符合C ++ 03的编译器中,事情应该像这样工作:
new A
- 不确定的价值 new A()
- 值初始化A,因为它是POD,所以它是零初始化的。
new B
- 默认初始化(使B :: m未初始化)
new B()
- 值初始化B,它初始化所有字段,因为它的默认ctor是编译器生成的,而不是用户定义的。
new C
- 默认 - 初始化C,C调用默认的ctor。
new C()
- 值 - 初始化C,它调用默认的ctor。 所以在所有版本的C ++中, new A
和new A()
之间都有区别,因为A是POD。
对于new B()
在C ++ 98和C ++ 03之间的行为有所不同。
这是C ++的尘土飞扬的角落之一,可以让你发疯。 当构建一个对象时,有时候你想要/需要这些对象,有时你绝对不能拥有它们,有时候并不重要。
new Thing();
明确表示你想要一个叫做new Thing;
的构造函数new Thing;
被认为暗示你不介意构造函数没有被调用。
如果在具有用户定义的构造函数的struct / class上使用,则没有区别。 如果调用一个简单的结构/类(例如struct Thing { int i; };
)然后new Thing;
就像malloc(sizeof(Thing));
而new Thing();
就像calloc(sizeof(Thing));
- 它初始化为零。
这个问题在于:
struct Thingy {
~Thingy(); // No-longer a trivial class
virtual WaxOn();
int i;
};
new Thingy;
的行为new Thingy;
vs new Thingy();
在这种情况下在C ++ 98和C ++ 2003之间进行了更改。 请参阅Michael Burr对如何和为什么的解释。
不,他们是一样的。 但是有一点区别:
Test t; // create a Test called t
和
Test t(); // declare a function called t which returns a Test
这是因为基本的C ++(和C)规则:如果某件事可能是一个声明,那么它就是一个声明。
编辑:关于POD和非POD数据的初始化问题,虽然我同意所有的说法,但我只想指出,这些问题仅适用于新的或构造的东西没有用户定义的构造函数。 如果有这样的构造函数,它将被使用。 对于99.99%明智设计的类,将会有这样的构造函数,所以这些问题可以被忽略。
链接地址: http://www.djcxy.com/p/6929.html上一篇: Do the parentheses after the type name make a difference with new?