编译器在C++中重载新运算符时如何识别类型
how compiler identifies the type when overloading new operator in C++
我重载了新运算符。但我想知道当我在重载的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
处理,然后它获取这些字节并调用构造函数。
相关文章:
- 提升 ASIO 无法识别计时器对象
- 从udp接收帧对于人脸识别来说太慢
- 模板类无法识别友元运算符
- std::visit无法识别类型
- 无法识别模板功能
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 如何在LLVM中dyn_cast以识别StoreInst?
- 从不同的附加依赖项中识别等同命名的函数
- C++出现控制台错误.我无法识别源代码的问题
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- Qt:"Q3DScatter"即使包含在内也无法识别
- 使用指针的类识别
- 如何静态识别动态堆分配?
- 为什么C++无法识别我的对象实例化?
- C++ 无法识别创建进程'telnet'
- 识别 2D 矢量C++中的位置
- 如何识别项目是 QT 中的文件还是文件夹
- ESP32 无法识别任何设备已连接到其接入点
- 无法识别 Mac c++ 文件系统库
- 识别数组中的重复元素?