關於c++ new操作符的過載
你知道c++ 的new操作符和operator new的區別麼?也許你還會問,他們有區別嗎?
當你寫下面這樣的**時,
string *pa = new string("memory managerment");
你使用的是new操作符,這個操作符和sizeof一樣,是c++語言級別支援的。你不能改變它的語義,它做的事情總是不變的:分配足夠的記憶體以容納物件,然後呼叫建構函式初始化上一步所分配的記憶體。new操作符總是做這兩件事情,你不能改變它的行為。
你所能改變的只是第一步的行為,如何為物件分配raw記憶體。operatornew 函式用來為物件分配原始記憶體。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") onmemory;
string* pa = static_cast(memory);
第二布包含了建構函式的呼叫。這是你的編譯器呼叫的。那麼你不緊會問,程式設計師可以手動呼叫建構函式嗎?答案是否定的。但是編譯器同時給你提供了另外乙個折中,是你可以達到這個目的。
需要說明的是,在乙個已存在的物件上呼叫建構函式是沒有任何意義的。因為建構函式用來初始化物件。但是有時候有一些記憶體已經被分配但是尚未初始化,你需要在這些記憶體中構造乙個物件。你可以使用operator new函式的乙個特殊版本。乙個術語叫placement new 的函式來做這件事情。
回到前面那個字串的例子,我們可以這樣使用placement new:
void* memory = operator new(sizeof(string));
string* pa = new (memory) string("memorymanagerment");
以上兩句就相當於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...