C++ 在C+中重载新运算符时编译器如何识别类型+;
我让新接线员超负荷工作。但我想知道,当我在重载的新操作符中调用全局新操作符时,编译器是如何识别类型的C++ 在C+中重载新运算符时编译器如何识别类型+;,c++,operator-overloading,new-operator,size-t,C++,Operator Overloading,New Operator,Size T,我让新接线员超负荷工作。但我想知道,当我在重载的新操作符中调用全局新操作符时,编译器是如何识别类型的 #include<iostream> class Samp{ public: Samp(){ std::cout<<"constructor\n"; } void* operator new(size_t sz){ std::cout<<"operator over
#include<iostream>
class Samp{
public:
Samp(){
std::cout<<"constructor\n";
}
void* operator new(size_t sz){
std::cout<<"operator overloading new\n";
return ::operator new(sz);
}
};
int main(){
Samp* a=new Samp;
return 0;
}
当我重载时,在新的重载函数中,我只提供了size\u t sz
(即大小),仅将其作为编译器如何识别Samp类型的参数,并在表达式中调用相应的构造函数??
new Samp;
C++编译器发现它试图构造类型<代码> Samp < /C>。从那里,它可以询问-我应该使用哪个
操作符new
函数来执行此操作?它总是可以从全局操作符new
中选择,但是由于编译器知道它正在构建Samp
,它也可以询问“doesSamp
重载操作符new
?”,然后告诉它查看Samp
内部,这就是它如何找到重载的方法
请注意,在本次讨论中,我一直在讨论要调用哪个操作符new
函数。“新的操作符”和“新的操作符的函数之间有一个微妙的区别,具体来说:
operator new
是一个函数,提供存储对象所需的原始存储字节
new
操作符首先调用operator new
以获取空间,然后在以这种方式返回的空间中调用对象的构造函数
当您重载操作符new
时,您会说“当我需要为对象获取空间时,请使用此函数获取我希望您放置该对象的字节。”这与实际在这些字节中创建对象是不同的。这是由表达式new Samp
处理的,然后它获取这些字节并调用构造函数。您将其向后调用——您不提供大小,编译器计算类型,而是编译器知道类型(来自new Samp
),并向您提供大小。
new Samp;