C++中的new是否在后台调用构造函数?或者是相反的方式?我见过类似new MyClass(*this)的代码,这让我很困惑,因为我不知道new可以接受参数。也许这是因为new可以调用一个构造函数,因此,它可以接受构造函数声明的参数?
new
new MyClass(*this)
mlmc2os51#
MyClass(*this)通过调用构造函数并传递*this作为参数来创建MyClass类型的对象。将new放在它后面意味着对象被分配到堆而不是堆栈上。不是new接受参数,而是MyClass。
MyClass(*this)
*this
MyClass
5gfr0r5j2#
new和operator new之间有一个区别,new操作符使用一个隐藏的operator new函数来分配内存,然后它还通过使用类名后面的参数调用对象的构造函数来“值初始化”对象。在您的示例中,您调用new,它使用::operator new()分配内存,然后使用带参数*this的构造函数在该内存中初始化MyClass类的对象。
operator new
::operator new()
#include <iostream> class A { public: int m_value; A(int value): m_value(value){}; }; int main (){ int *a = new int; auto cb= new A(1); std::cout << *a << std::endl; std::cout << b->m_value << std::endl; printf("%02x ", *b); }
Program returned: 0 15 0f
如您所见,a变量的new只创建了一个值初始化为0的指针。这就是为什么当我们解引用它时,我们有0(所有位都是0,int大多数时候是4个字节,指针指向内存内容= 0x0000)但是对于b变量,我们传递参数,如果我们查看b对象的内存内容,我们可以读取0f,这意味着它包含15(成员值)
a
b
0f
c9qzyr3d3#
这不是new接受参数,而是构造函数接受参数。
3条答案
按热度按时间mlmc2os51#
MyClass(*this)
通过调用构造函数并传递*this
作为参数来创建MyClass
类型的对象。将new
放在它后面意味着对象被分配到堆而不是堆栈上。不是new
接受参数,而是MyClass
。5gfr0r5j2#
new
和operator new
之间有一个区别,new
操作符使用一个隐藏的operator new
函数来分配内存,然后它还通过使用类名后面的参数调用对象的构造函数来“值初始化”对象。在您的示例中,您调用
new
,它使用::operator new()
分配内存,然后使用带参数*this
的构造函数在该内存中初始化MyClass
类的对象。如您所见,
a
变量的new
只创建了一个值初始化为0的指针。这就是为什么当我们解引用它时,我们有0(所有位都是0,int大多数时候是4个字节,指针指向内存内容= 0x0000)但是对于
b
变量,我们传递参数,如果我们查看b
对象的内存内容,我们可以读取0f
,这意味着它包含15(成员值)c9qzyr3d3#
这不是
new
接受参数,而是构造函数接受参数。