(四) new的三種形式

2021-08-29 09:46:37 字數 1554 閱讀 2759

在c語言中我們分配堆記憶體一般使用malloc和free這對函式,但在 c++提供了一組操作符用於分配記憶體 new和delete,這是一組和sizeof一樣語言內建的操作符。

當new與malloc分配的都是系統已有型別,即 int,char 這些系統已有型別時,兩者並無差別,都是申請記憶體,並且申請的記憶體裡的資料為不確定值。但是new可以對資料進行初識化而malloc卻不能。c++始終是物件導向的語言,當malloc給乙個物件分配記憶體時,物件的產生就必須執行建構函式,而malloc沒有這個機制,他只對物件記憶體進行申請而不進行初始化,程式設計師必須自己寫相應的初始化函式。new 操作符相對就比較高明一點,分配記憶體時會構造物件即會呼叫建構函式,delete 也會自動呼叫,更為智慧型。

測試**

#include #include #include using namespace std;

class string

else

cout << "構造物件:"q->freestring();

free(q);

return 0;

}

new操作符的過載叫做操作符new,有點繞,一般使用的new是(new operator),過載之後是(operator new)

過載後的操作符new實現的內容和malloc功能基本一樣。過載之後再使用new時,系統預設呼叫過載之後的方式,因為你既然已經過載了new操作符,那麼表示你並不滿意系統的new操作符,同樣在類裡面過載,那麼在申請該類的物件時,就會呼叫類裡面的過載函式。過載new操作符那麼相應的delete操作符也應該操作。

測試**

#include #include #include using namespace std;

void *operator new(size_t size)

當使用new申請的是一片陣列記憶體時,那麼使用像 int *p = new int(10); 這種方式就不能進行初始化了。形如 int *p = new int[10](10);顯然這是一種錯誤的寫法,編譯器並不知道你要對陣列當中的那個成員進行初始化為10。這就出現了 placement new 這種叫做定位new的操作。理解不深就只寫用法了

測試**

#include #include #include using namespace std;

class string

else

cout << "構造物件:"<}

// 析構函式

~string()

// 初識化函式

void initstring(const char *str = null)

else

cout << "呼叫初識化函式"

void freestring()

private:

char *data;

};int main(void)

}

if 語句的三種形式

if 語句的三種形式 第一種形式為基本形式 if 如果表示式的值為真,則執行其後的語句,否則不執行該語句。第二種形式為 if else 如果表示式的值為真,則執行語句1,否則執行語句2。第三種形式為 if else if 依次判斷表示式的值,當出現某個值為真時,則執行其對應的語句。然後跳到整個if語...

javascript三種函式形式

1.普通函式 function show message show test 定義 同python中函式定義方法一致,關鍵字替換為function 執行 呼叫方法和一般語言中呼叫方法一致,可有返回值 2.匿名函式 setinterval function 1000 a function messag...

梯度下降的三種形式

1 批量梯度下降法bgd 批量梯度下降法 batch gradient descent,簡稱bgd 是梯度下降法最原始的形式,它的具體思路是在更新每一引數時都使用所有的樣本來進行更新。優點 全域性最優解 易於並行實現 缺點 當樣本數目很多時,訓練過程會很慢。2 隨機梯度下降法sgd 隨機梯度下降是通...