C++ 为新运算符重载而在中调用的对象

C++ 为新运算符重载而在中调用的对象,c++,C++,我熟悉这样一个概念:调用重载操作符需要一个对象(如果没有使用友元函数) 例如: Test obj1,obj2; //some initialization already done obj1 + obj2; // for complier it is translated as obj1.operator+(obj2) 但在过载的情况下运算符新建 Test *ptr = new Test; 谁调用调用调用 当您调用new(重载或非重载)时,您正在构造一个对象,因此还没有对象,您无法回答“哪个

我熟悉这样一个概念:调用重载操作符需要一个对象(如果没有使用友元函数)

例如:

Test obj1,obj2; //some initialization already done
obj1 + obj2; // for complier it is translated as obj1.operator+(obj2)
但在过载的情况下
运算符新建

Test *ptr = new Test;
谁调用调用调用

当您调用new(重载或非重载)时,您正在构造一个对象,因此还没有对象,您无法回答“哪个对象调用了调用?”

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

调用方不是该类的对象

当您调用new(重载或非重载)时,您正在构造一个对象,因此还没有对象,您无法回答“哪个对象调用了调用?”

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


调用方不是该类的对象

让我们把事情分成适当的术语:

当您编写新测试时,它是一个“新表达式”。新表达式的语义是调用适当的分配函数(重载
操作符new
)并在其分配的内存中初始化对象


因此,您编写的表达式调用重载的运算符函数。

让我们用适当的术语来区分:

当您编写新测试时,它是一个“新表达式”。新表达式的语义是调用适当的分配函数(重载
操作符new
)并在其分配的内存中初始化对象


因此,您编写的表达式是调用重载的运算符的函数。

简短的回答是:编译器会这样做

更详细地,给出

Test *ptr = new Test;
编译器需要查看
Test
的完整定义,以便使用新表达式(
newtest
)实例化它。当编译器没有这种可见性时,它将给出一个诊断(在本例中,实际上是一个编译错误)

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

给定这些信息,编译器将发出适当的代码,调用
操作符new()
的适当重载来获取内存,然后使用构造函数初始化该内存。它还发出代码来处理错误条件(例如,如果
操作符new()
或构造函数抛出异常,则给出所需的行为)


调用
操作符new()
不需要对象(Test的实例
),因为在构建对象之前就调用了
操作符new()
。这与
operator+()
等运算符不同,后者对两个现有对象进行操作。

简单的回答是:编译器可以

更详细地,给出

Test *ptr = new Test;
编译器需要查看
Test
的完整定义,以便使用新表达式(
newtest
)实例化它。当编译器没有这种可见性时,它将给出一个诊断(在本例中,实际上是一个编译错误)

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

给定这些信息,编译器将发出适当的代码,调用
操作符new()
的适当重载来获取内存,然后使用构造函数初始化该内存。它还发出代码来处理错误条件(例如,如果
操作符new()
或构造函数抛出异常,则给出所需的行为)

调用
操作符new()
不需要对象(Test的实例
),因为在构建对象之前就调用了
操作符new()
。这不同于对两个现有对象进行操作的操作符,如
operator+()