c++ new采用什么参数?

lhcgjxsq  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(248)

C++中的new是否在后台调用构造函数?或者是相反的方式?
我见过类似new MyClass(*this)的代码,这让我很困惑,因为我不知道new可以接受参数。
也许这是因为new可以调用一个构造函数,因此,它可以接受构造函数声明的参数?

mlmc2os5

mlmc2os51#

MyClass(*this)通过调用构造函数并传递*this作为参数来创建MyClass类型的对象。将new放在它后面意味着对象被分配到堆而不是堆栈上。不是new接受参数,而是MyClass

5gfr0r5j

5gfr0r5j2#

newoperator new之间有一个区别,new操作符使用一个隐藏的operator new函数来分配内存,然后它还通过使用类名后面的参数调用对象的构造函数来“值初始化”对象。
在您的示例中,您调用new,它使用::operator new()分配内存,然后使用带参数*this的构造函数在该内存中初始化MyClass类的对象。

#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(成员值)

c9qzyr3d

c9qzyr3d3#

这不是new接受参数,而是构造函数接受参数。

相关问题