十三、动态对象创建(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 []
创建和销毁一个数组