编译器在C++中重载新运算符时如何识别类型

how compiler identifies the type when overloading new operator in C++

本文关键字:何识别 识别 类型 C++ 重载 运算符 编译器      更新时间:2024-09-29

我重载了新运算符。但我想知道当我在重载的new操作符中调用全局new操作符时,编译器是如何识别类型的。

#include<iostream>
class Samp{
public:
Samp(){
std::cout<<"constructorn";
}
void* operator new(size_t sz){
std::cout<<"operator overloading newn";
return ::operator new(sz);
}
};
int main(){
Samp* a=new Samp;
return 0;
}

这里的输出是-

operator overloading new   
constructor           

当我重载时,在新的重载函数中,我只提供了size_t sz(它只是大小(,通过将其单独作为参数,编译器如何识别这是Samp类型并调用相应的构造函数??

在表达式中

new Samp;

C++编译器发现它正试图构造CCD_ 2类型的东西。然后,它可以问——我应该使用哪个operator new函数来执行此操作?它总是可以从全局operator new中选择,但由于编译器知道它正在构建Samp,所以它也可以询问";Samp是否使operator new过载"然后告诉它查看Samp内部,这就是它发现过载的方式。

请注意,在本次讨论中,我一直在讨论要调用哪个operator new函数。这里有一个微妙的区别";CCD_ 10运算符";以及";函数CCD_ 11"具体而言:

  • operator new是一个提供存储对象所需的原始存储字节的函数
  • new操作符首先调用operator new来获取空间,然后调用以这种方式返回的空间中对象的构造函数

当您使operator new过载时,您在说";当我需要为一个对象获取空间时,请使用此函数来获取我希望您放置该对象的字节"这与在这些字节中实际创建对象是分开的。这由表达式new Samp处理,然后它获取这些字节并调用构造函数。