我正在尝试了解重载新运算符。我编写了如下代码。
#include <iostream>
#include <cstdlib>
#include <new>
using namespace std;
class loc
{
int lo, la;
public:
loc()
{
}
loc(int x, int y)
{
cout << "In constructor\n";
lo = x;
la = y;
}
void show()
{
cout << lo << " ";
cout << la << endl;
}
void *operator new(size_t sz);
void operator delete(void *p);
};
void *loc::operator new(size_t sz)
{
cout << "in Overloaded new\n";
void *p = malloc(sz);
return p;
}
void loc::operator delete(void *p)
{
cout << "in Overloaded delete\n";
free(p);
}
int main()
{
loc *p1 = new loc(10, 20);
p1->show();
delete p1;
return 0;
}
我认为它不会调用构造函数,因为我在重载函数中重载了带有malloc函数调用的new运算符。但输出结果如下。
in Overloaded new
In constructor
10 20
in Overloaded delete
这意味着构造函数被调用。这怎么可能?这是否意味着malloc()会调用构造函数吗?
答案 0 :(得分:7)
new expression导致发生两件事:分配对象开始创建所需的内存,以及初始化对象。
另一方面,new operator只处理分配部分。当您针对特定类重载new运算符时,您将替换对象的内存分配。
当您意识到并非所有对象都在堆上分配时,这种功能划分才有意义。考虑以下情况:
int main() {
string someString;
..
}
不动态分配局部变量; new
未使用;但是仍然需要初始化对象,因此仍然会调用构造函数。请注意,您不需要显式调用构造函数 - 在语言中隐含的是,在创建对象时,将始终调用适当的构造函数来初始化对象。
当你编写一个新的表达式时,编译器知道发出指令来调用new运算符(根据需要分配内存),然后调用构造函数(初始化对象)。无论是否重载新运算符,都会发生这种情况。