第9讲动态内存分配736304930.ppt
《第9讲动态内存分配736304930.ppt》由会员分享,可在线阅读,更多相关《第9讲动态内存分配736304930.ppt(41页珍藏版)》请在三一文库上搜索。
1、第九讲 动态内存分配,教材:C+语言程序设计(第4版) 第6章 6.36.5、6.8,清华大学 郑 莉,目录,9.1 动态内存分配 9.2 用vector创建数组对象 9.3 深拷贝与浅拷贝 9.4 深度探索 9.5 小结,2,3,9.1 动态内存分配,动态申请内存操作符 new,new 类型名T(初始化参数列表) 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。 结果值:成功:T类型的指针,指向新分配的内存;失败:抛出异常。,4,9.1 动态内存分配,释放内存操作符delete,delete 指针p 功能:释放指针p所指向的内存。p必须是new操作的返回值。,例
2、9-1(教材例6-16) 动态创建对象举例,5,#include using namespace std; class Point public: Point() : x(0), y(0) cout“Default Constructor called.“endl; Point(int x, int y) : x(x), y(y) cout “Constructor called.“endl; Point() cout“Destructor called.“endl; int getX() const return x; int getY() const return y; void move
3、(int newX, int newY) x = newX; y = newY; private: int x, y; ;,9.1 动态内存分配,例9-1 (续),6,int main() cout “Step one: “ endl; Point *ptr1 = new Point;/调用缺省构造函数 delete ptr1; /删除对象,自动调用析构函数 cout “Step two: “ endl; ptr1 = new Point(1,2); delete ptr1; return 0; ,9.1 动态内存分配,运行结果: Step One: Default Constructor c
4、alled. Destructor called. Step Two: Constructor called. Destructor called.,7,9.1 动态内存分配,申请和释放动态数组,分配:new 类型名T 数组长度 数组长度可以是任何表达式,在运行时计算 释放:delete 数组名p 释放指针p所指向的数组。p必须是用new分配得到的数组首地址。,例9-2(教材例6-17) 动态创建对象数组举例,8,#include using namespace std; class Point /类的声明同例6-16,略 ; int main() Point *ptr = new Point
5、2; /创建对象数组 ptr0.move(5, 10); /通过指针访问数组元素的成员 ptr1.move(15, 20); /通过指针访问数组元素的成员 cout “Deleting.“ endl; delete ptr; /删除整个对象数组 return 0; ,9.1 动态内存分配,9,例9-2 (续),运行结果: Default Constructor called. Default Constructor called. Deleting. Destructor called. Destructor called.,9.1 动态内存分配,10,9.1 动态内存分配,将动态数组封装成类
6、,更加简洁,便于管理 建立和删除数组的过程比较繁琐 封装成类后更加简洁,便于管理 可以在访问数组元素前检查下标是否越界 用assert来检查,assert只在调试时生效,例9-3(教材例6-18)动态数组类,11,#include #include using namespace std; class Point /类的声明同例6-16 ; class ArrayOfPoints /动态数组类 public: ArrayOfPoints(int size) : size(size) points = new Pointsize; ArrayOfPoints() cout = 0 ,9.1 动态
7、内存分配,例9-3 (续),12,int main() int count; cout count; ArrayOfPoints points(count); /创建对象数组 /通过访问数组元素的成员 points.element(0).move(5, 0); /通过类访问数组元素的成员 points.element(1).move(15, 20); return 0; ,9.1 动态内存分配,13,例9-3 (续),运行结果: Please enter the number of points:2 Default Constructor called. Default Constructor
8、 called. Deleting. Destructor called. Destructor called.,9.1 动态内存分配,14,9.1 动态内存分配,动态创建多维数组,new 类型名T第1维长度第2维长度; 如果内存申请成功,new运算返回一个指向新分配内存首地址的指针,是一个T类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。 例如: char (*fp)3; fp = new char23;,15,9.1 动态内存分配,char (*fp)3;,fp,fp+1,例9-4(教材例6-19) 动态创建多维数组,16,#include using namespace
9、std; int main() float (*cp)98 = new float898; for (int i = 0; i (i * 100 + j * 10 + k);,9.1 动态内存分配,例9-4 (续),17,for (int i = 0; i 8; i+) for (int j = 0; j 9; j+) for (int k = 0; k 8; k+) /将指针cp作为数组名使用,通过数组名和下标访问数组元素 cout cpijk “ “; cout endl; cout endl; delete cp; return 0; ,9.1 动态内存分配,18,用vector创建数组
10、对象,为什么需要vector? 将动态数组封装,自动创建和删除 数组下标越界检查 例6-18中封装的ArrayOfPoints也提供了类似功能,但只适用于一种类型的数组 vector动态数组对象的定义 vector 数组对象名(数组长度); 例:vector arr(5) 建立大小为5的int数组,9.2 用vector创建数组对象,19,9.2 用vector创建数组对象,vector数组对象的使用,对数组元素的引用 与普通数组具有相同形式: 数组对象名 下标表达式 但vector数组对象名不表示数组首地址 获得数组长度 用size函数 数组对象名.size(),例9-5(教材例6-20)v
11、ector应用举例,20,#include #include using namespace std; /计算数组arr中元素的平均值 double average(const vector ,9.2 用vector创建数组对象,例9-5 (续),21,int main() unsigned n; cout n; vector arr(n); /创建数组对象 cout arri; cout “Average = “ average(arr) endl; return 0; ,9.2 用vector创建数组对象,22,9.3 深拷贝与浅拷贝,深拷贝与浅拷贝,浅拷贝 实现对象间数据元素的一一对应复
12、制。 深拷贝 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指对象进行复制。,例9-6(教材例6-21)对象的浅拷贝,23,#include #include using namespace std; class Point /类的声明同例6-16 / ; class ArrayOfPoints /类的声明同例6-18 / ;,9.3 深拷贝与浅拷贝,例9-6 (续),24,int main() int count; cout count; ArrayOfPoints pointsArray1(count); /创建对象数组 pointsArray1.element(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 内存 分配 736304930
链接地址:https://www.31doc.com/p-3137974.html