十三、動態對象創建(Dynamic Object Creation)
目錄
- 13.1 對象創建(Object creation)
- 13.2
new
/delete
操作符 - 13.3 數組的
new
與delete
- 13.4 總結
背景說明
-
有時候我們需要知道程序中對象的數量、類型和聲明周期,但并不總是如此
-
為了應對一般編程問題,必須能夠在運行時創建和銷毀對象。
-
存儲區域可以粗略分為三部分
-
靜態存儲區域
-
動態內存分配(堆,heap)
-
棧
-
-
這里要講到的動態內存分配就是使用
new
、delete
。
13.1 動態對象創建
創建一個C++對象時,會發生兩個事件:
- 為該對象分配存儲空間:
- 靜態存儲區
- 棧
- 堆(動態內存分配)
- 調用構造函數來初始化這塊存儲區域
13.2 操作符 new
/ delete
語法格式
new type(initializer); //創建一個動態的對象
delete pointername;//銷毀一個動態對象
new type
沒有initializer
,意味著參數為默認參數或者無參數。
示例1
MyType* p = new MyType(1,2);
MyType* fp = new MyType;
delete p;
delete fp;
示例2
#include <iostream>
using namespace std;
class Tree{int height;
public:Tree(int treeHeight = 0):height(treeHeight){}void print(){cout << height << endl;}
};
void main(){Tree* t = new Tree(40);t->print();delete t;
}
輸出
40
13.3 new
/ delete
數組
語法格式
new type[size];
delete []pointername;
示例1
MyTree *fp = new MyTree[100];
delete []fp;
示例2
#include <iostream>
using namespace std;
class Tree {int height;
public:Tree(int treeHeight = 0) :height(treeHeight) { cout << "Constructor:" << height << endl; }void print() { cout << height << endl; }
};void main()
{Tree* t = new Tree[3];t[2] = Tree(40);t[2].print();delete[]t;
}
new
/new[]
返回一個指向指定類型的指針。- 由
new
創建的對象必須通過delete
來銷毀。 - 指針只能被
delete
或delete []
銷毀一次。
13.4 總結
- 使用
new
/delete
創建和銷毀一個對象 - 使用
new[]
/delete []
創建和銷毀一個數組