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
实现为宏?
答案 0 :(得分:5)
你的问题应该是:
当
new B()
语法相同时,编译器如何区分new B(10)
和B::operator new
?
好吧,new
只是分配内存,然后编译器立即将调用插入到构造函数中。因此,无论您拨打new B
,new 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的大小),然后调用适当的构造函数代码来初始化该空间中的对象。