關於c new操作符的過載

2021-05-26 18:13:15 字數 1581 閱讀 6486

關於c++ new操作符的過載

你知道c++ 的new 操作符和operator new 的區別麼?也許你還會問,他們有區別嗎?

當你寫下面這樣的**時,

string *pa = new string("memory managerment");

你使用的是new 操作符,這個操作符和sizeof 一樣,是c++ 語言級別支援的。你不能改變它的語義,它做的事情總是不變的:分配足夠的記憶體以容納物件,然後呼叫建構函式初始化上一步所分配的記憶體。new 操作符總是做這兩件事情,你不能改變它的行為。

你所能改變的只是第一步的行為,如何為物件分配raw 記憶體。operator new 函式用來為物件分配原始記憶體。new 操作符的第一步呼叫的就是operator new 。你可以過載這個函式。它的原型如下:

void* operator new(size_t size);

函式的返回值是void*, 因為這個函式返回的是指標。這個指標指向原生的,為初始化的記憶體。其語義就像malloc 。實際上它內部呼叫的就是malloc 。引數size 指定待分配的記憶體大小。你可以在過載的時候加上額外的引數,但是第乙個引數型別必須是size_t.

絕大多數情況下,你不需要呼叫operator new, 萬一你需要呼叫它,呼叫的格式是這樣的:

void* rawmemory = operator new(sizeof(string));

函式operator new 將返回乙個指標,指向一塊足夠容納乙個string 物件的記憶體。

就像malloc 一樣,operator new 的唯一的職責就是分配記憶體,它對建構函式一無所知。把operator new 返回的未初始化的指標構造成乙個物件是new 操作符的工作。當你的編譯器遇到以下的**時:

string *pa = new string("memory managerment");

它生成的偽**類以如下:

void* memory = operator new(sizeof(string));

call string::string("memory managerment") on memory ;

string* pa = static_cast(memory);

第二布包含了建構函式的呼叫。這是你的編譯器呼叫的。那麼你不緊會問,程式設計師可以手動呼叫建構函式嗎?答案是否定的。但是編譯器同時給你提供了另外乙個折中,是你可以達到這個目的。

需要說明的是,在乙個已存在的物件上呼叫建構函式是沒有任何意義的。因為建構函式用來初始化物件。但是有時候有一些記憶體已經被分配但是尚未初始化,你需要在這些記憶體中構造乙個物件。你可以使用operator new 函式的乙個特殊版本。乙個術語叫placement new 的函式來做這件事情。

回到前面那個字串的例子,我們可以這樣使用placement new :

void* memory = operator new(sizeof(string));

string* pa = new (memory) string("memory managerment");

以上兩句就相當於new 操作符所做的事情了。

這就是operator new 和placement new 的全部秘密。一般的來說,你不需要過載和顯式呼叫這兩個函式。

關於c new操作符的過載

關於c new操作符的過載 你知道c 的new操作符和operator new的區別麼?也許你還會問,他們有區別嗎?當你寫下面這樣的 時,string pa new string memory managerment 你使用的是new操作符,這個操作符和sizeof一樣,是c 語言級別支援的。你不能...

操作符過載

ifndef vertex h define vertex h class vertex vertex float px float py float pz vertex operator const vertex p vertex operator const vertex p void oper...

操作符過載

1.操作符是靜態方法,返回值表示操作結果,引數是運算元。2.操作符過載需要在過載的操作符前加上operator關鍵字。3.最好少用操作符過載,只有在意義明晰而且與內建類的操作一致時才適合使用,以免造成混亂。以建立的分數類 fraction 中的 為例,該分數類中有兩個int型的私有屬性 分子 num...