我熟悉需要一个对象(如果没有使用友元函数)来调用重载运算符的概念。
例如:
Test obj1,obj2; //some initialization already done
obj1 + obj2; // for complier it is translated as obj1.operator+(obj2)
但是在重载operator new
Test *ptr = new Test;
谁调用了电话?
答案 0 :(得分:2)
让我们分开正确的术语:
当你写new Test
时,它是一个"新表达式"。新表达式的语义是调用适当的分配函数(operator new
的重载)并初始化它分配的内存中的对象。
所以你写的表达式就是调用重载的运算符函数。
答案 1 :(得分:1)
答案简短:编译器确实如此。
更详细,给出
Test *ptr = new Test;
编译器需要可见Test
的完整定义,以便使用新表达式new Test
)对其进行实例化。当编译器没有该可见性时,它将给出诊断(在这种情况下,实际上是编译错误)。
class
或struct
类型的定义包括其提供的任何operator new()
函数的任何声明。由于编译器具有完全的可见性,因此可以决定需要调用哪个版本的operator new()
。
鉴于该信息,编译器会发出适当的代码来调用operator new()
的适当重载以获取内存,然后使用构造函数初始化该内存。它还会发出代码来处理错误情况(例如,如果operator new()
或构造函数抛出异常,则提供所需的行为。)
调用Test
不需要任何对象(operator new()
的实例),因为在构造对象之前调用了operator new()
。这与运行在两个现有对象上的operator+()
等运算符不同。
答案 2 :(得分:0)
当您调用 new (是否重载)时,您正在构建一个对象,因此还没有对象,您无法回答“哪个对象调用该调用?”的问题。
当您创建指定类的对象(在堆或堆栈上)时,将调用该类的一个构造函数。 当 new 运算符重载时,将使用重载的 new 为该对象分配所需的内存。
来电者不是那个班级的对象!