我想在c ++上做得更好。 我在main()中有一个Test类和下面的代码。
Test *pObj = new Test();
如果我们通过逐个步骤逐步调试,首先它转到新函数来分配内存,然后调用构造函数。然后它回到main()函数。众所周知,构造函数不会返回任何内容。在那种情况下,为什么pObj将具有由new分配的指针?知道它是如何由编译器实现的吗?
答案 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 []。“