如何实现C ++“新”运算符

时间:2012-03-07 04:15:25

标签: c++ new-operator

Class B;
B *b  = new B();       // default constructor
B *b1 = new B(10);     // constructor which takes an argument B(int x)

但是,如果我们要编写new的自定义版本,则语法为

Class B
{
  /*...*/
  static void* operator new(size_t size);
}

如何将语句new B()转换为函数调用 operator new(sizeof(B))

它如何跟踪要调用的构造函数,即它如何区分new B()new B(int x)

是否在C ++中将new实现为宏?

2 个答案:

答案 0 :(得分:5)

你的问题应该是:

  

new B()语法相同时,编译器如何区分new B(10)B::operator new

好吧,new 只是分配内存,然后编译器立即将调用插入到构造函数中。因此,无论您拨打new Bnew B()还是new B(10),都无关紧要。

编译器解释如下:

B *b = static_cast<B*>(B::operator new(sizeof(B)))->B();
B *b1 = static_cast<B*>(B::operator new(sizeof(B)))->B(10);

实际上构造函数不返回任何内容。但是上面的伪代码只是内部东西的类比表示。

答案 1 :(得分:0)

调用哪个构造函数的问题是基于参数列表的重载解决问题,类似于任何重载函数调用。在发生新B(...)的站点,所有信息都可用。编译器可以解析对类B的引用(名称查找),并查看可用的构造函数组合,还可以看到B具有自定义内存分配器机制。编译器可以发出代码以使用该内存分配器来获取空间(传入B的大小),然后调用适当的构造函数代码来初始化该空间中的对象。