c++ new采用什么参数?

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

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类的对象。

  1. #include <iostream>
  2. class A {
  3. public:
  4. int m_value;
  5. A(int value): m_value(value){};
  6. };
  7. int main (){
  8. int *a = new int;
  9. auto cb= new A(1);
  10. std::cout << *a << std::endl;
  11. std::cout << b->m_value << std::endl;
  12. printf("%02x ", *b);
  13. }
  1. Program returned:
  2. 0
  3. 15
  4. 0f

如您所见,a变量的new只创建了一个值初始化为0的指针。这就是为什么当我们解引用它时,我们有0(所有位都是0,int大多数时候是4个字节,指针指向内存内容= 0x0000)
但是对于b变量,我们传递参数,如果我们查看b对象的内存内容,我们可以读取0f,这意味着它包含15(成员值)

展开查看全部
c9qzyr3d

c9qzyr3d3#

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

相关问题