对象调用新运算符重载

时间:2017-09-04 08:29:48

标签: c++

我熟悉需要一个对象(如果没有使用友元函数)来调用重载运算符的概念。

例如:

Test obj1,obj2; //some initialization already done
obj1 + obj2; // for complier it is translated as obj1.operator+(obj2)

但是在重载operator new

的情况下
Test *ptr = new Test;

谁调用了电话?

3 个答案:

答案 0 :(得分:2)

让我们分开正确的术语:

当你写new Test时,它是一个"新表达式"。新表达式的语义是调用适当的分配函数(operator new的重载)并初始化它分配的内存中的对象。

所以你写的表达式就是调用重载的运算符函数。

答案 1 :(得分:1)

答案简短:编译器确实如此。

更详细,给出

Test *ptr = new Test;

编译器需要可见Test的完整定义,以便使用新表达式new Test)对其进行实例化。当编译器没有该可见性时,它将给出诊断(在这种情况下,实际上是编译错误)。

classstruct类型的定义包括其提供的任何operator new()函数的任何声明。由于编译器具有完全的可见性,因此可以决定需要调用哪个版本的operator new()

鉴于该信息,编译器会发出适当的代码来调用operator new()的适当重载以获取内存,然后使用构造函数初始化该内存。它还会发出代码来处理错误情况(例如,如果operator new()或构造函数抛出异常,则提供所需的行为。)

调用Test不需要任何对象(operator new()的实例),因为在构造对象之前调用了operator new()。这与运行在两个现有对象上的operator+()等运算符不同。

答案 2 :(得分:0)

当您调用 new (是否重载)时,您正在构建一个对象,因此还没有对象,您无法回答“哪个对象调用该调用?”的问题。

当您创建指定类的对象(在堆或堆栈上)时,将调用该类的一个构造函数。 当 new 运算符重载时,将使用重载的 new 为该对象分配所需的内存。

来电者不是那个班级的对象!