它是如何工作的,Test * pObj = new Test();因为构造函数不返回任何内容

时间:2010-08-30 08:11:09

标签: c++

我想在c ++上做得更好。 我在main()中有一个Test类和下面的代码。

Test *pObj = new Test();

如果我们通过逐个步骤逐步调试,首先它转到新函数来分配内存,然后调用构造函数。然后它回到main()函数。众所周知,构造函数不会返回任何内容。在那种情况下,为什么pObj将具有由new分配的指针?知道它是如何由编译器实现的吗?

6 个答案:

答案 0 :(得分:5)

当您使用new表达式时,编译器会生成用于分配内存的代码,然后调用已分配内存上的构造函数来创建新对象。如果成功,则返回指向新对象的指针。

构造函数没有返回值,编译器只是在一块内存上添加对构造函数的调用,它需要构造新对象。构造函数没有必要返回对象的位置,代码已经知道对象必须在哪里;它(有效地)将传递给构造函数。

答案 1 :(得分:4)

是..构造函数没有返回任何内容..但new运算符构造并返回正在Test类实例的已分配内存地址由pObj指出..

答案 2 :(得分:0)

您应该关注的返回值是new'返回',在这种情况下是新分配对象的地址。

new可以通过调用malloc来实现,例如,它会真正返回地址(编辑:请参阅下面的评论)。

答案 3 :(得分:0)

我想,我得到了答案。 new运算符分配内存并调用构造函数。 它将传递此指针作为新分配的相同指针。 一旦构造函数返回,控制就会返回到编译器的新操作符实现。(不是main()函数)。 然后,一旦new返回,因为它给出了分配的指针,pObj将具有该指针。

答案 4 :(得分:0)

new和delete是运算符。默认情况下, new 运算符为对象分配内存,并返回指向该内存的指针。如果构造函数基于new运算符之后的语法,则为所创建的对象存在一个构造函数。在调用构造函数之前已经分配了对象,因此构造函数不需要返回任何内容。它本质上是一个在分配后调用的void方法。

全局new运算符通常作为函数实现,例如 void * new(size_t s),其中s是要分配的对象的大小。编译器计算要在底层创建的对象的大小并将其传递给new,将指针返回到已分配的内存,然后调用构造函数。

您可以全局或按类覆盖新运算符以添加自己的行为。

答案 5 :(得分:0)

$ 5.3.4 / 1 - “如果实体是非数组对象,则new-expression返回指向所创建对象的指针。如果是数组,则new-expression返回指向初始元素的指针。数组。“

注意新表达式和operator new不是同一个东西。

$ 5.3.4 / 8-“如果分配的类型是非数组类型,则分配函数的名称是operator new,而释放函数的名称是operator delete。如果分配的类型是数组类型,则分配函数的名称是operator new [],deallocation函数的名称是operator delete []。“