![](/img/trans.png)
[英]Error while overloading increment operator inside overloaded I/O operator
[英]why overloaded new operator is calling constructor even I am using malloc inside overloading function?
我試圖了解重載新運算符。 我編寫了如下代碼。
#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()會調用構造函數?
新表達式導致發生兩個不同的事情:開始創建對象所需的內存分配,以及對象的初始化。
另一方面, 新運算符只處理分配部分。 當您針對特定類重載new運算符時,您將替換對象的內存分配。
當您意識到並非所有對象都在堆上分配時,這種功能划分才有意義。 考慮以下情況:
int main() {
string someString;
..
}
局部變量不是動態分配的; new
的沒用過; 但是仍然需要初始化對象,因此仍然會調用構造函數。 請注意,您不需要顯式調用構造函數 - 在語言中隱含的是,在創建對象時,將始終調用適當的構造函數來初始化對象。
當你編寫一個'new expression'時,編譯器知道發出指令來調用new運算符(根據需要分配內存),然后調用構造函數(初始化對象)。 無論是否重載新運算符,都會發生這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.