Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中重载新运算符时编译器如何识别类型+;_C++_Operator Overloading_New Operator_Size T - Fatal编程技术网

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
,它也可以询问“does
Samp
重载
操作符new
?”,然后告诉它查看
Samp
内部,这就是它如何找到重载的方法

请注意,在本次讨论中,我一直在讨论要调用哪个
操作符new
函数。“新的
操作符”和“新的
操作符的函数
之间有一个微妙的区别,具体来说:

  • operator new
    是一个函数,提供存储对象所需的原始存储字节
  • new
    操作符首先调用
    operator new
    以获取空间,然后在以这种方式返回的空间中调用对象的构造函数
当您重载
操作符new
时,您会说“当我需要为对象获取空间时,请使用此函数获取我希望您放置该对象的字节。”这与实际在这些字节中创建对象是不同的。这是由表达式
new Samp
处理的,然后它获取这些字节并调用构造函数。

您将其向后调用——您不提供大小,编译器计算类型,而是编译器知道类型(来自
new Samp
),并向您提供大小。
new Samp;