第9讲动态内存分配736304930电子教案

上传人:yulij****0329 文档编号:138584132 上传时间:2020-07-16 格式:PPT 页数:41 大小:374.50KB
返回 下载 相关 举报
第9讲动态内存分配736304930电子教案_第1页
第1页 / 共41页
第9讲动态内存分配736304930电子教案_第2页
第2页 / 共41页
第9讲动态内存分配736304930电子教案_第3页
第3页 / 共41页
第9讲动态内存分配736304930电子教案_第4页
第4页 / 共41页
第9讲动态内存分配736304930电子教案_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《第9讲动态内存分配736304930电子教案》由会员分享,可在线阅读,更多相关《第9讲动态内存分配736304930电子教案(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,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 called. Destructor called. Step Two: Constructor called. Destructor called.,7,9.1

3、动态内存分配,申请和释放动态数组,分配: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 Point2;/创建对象数组 ptr0.move(5, 10); /通过指针访问数组元素的成员 ptr1.move(15, 20); /通过指针访问数组元素的成员 cout

4、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 动态内存分配,将动态数组封装成类,更加简洁,便于管理 建立和删除数组的过程比较繁琐 封装成类后更加简洁,便于管理 可以在访问数组元素前检查下标是否越界 用assert来检查,assert只在调试时生效,

5、例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 动态内存分配,例9-3 (续),12,int main() int count; cout count; ArrayOfPoints points(count);/创建对象数

6、组 /通过访问数组元素的成员 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 called. Deleting. Destructor called. Destructor called.,9.1 动态内存分配,14,9.1 动态内存分配,动态创建

7、多维数组,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 std; int main() float (*cp)98 = new float898; for (int i = 0; i (i * 100 + j * 10 + k);

8、,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创建数组对象,为什么需要vector? 将动态数组封装,自动创建和删除 数组下标越界检查 例6-18中封装的ArrayOfPoints也提供了类似功能,但只适用于一种类型的数组 vecto

9、r动态数组对象的定义 vector 数组对象名(数组长度); 例:vector arr(5)建立大小为5的int数组,9.2 用vector创建数组对象,19,9.2 用vector创建数组对象,vector数组对象的使用,对数组元素的引用 与普通数组具有相同形式: 数组对象名 下标表达式 但vector数组对象名不表示数组首地址 获得数组长度 用size函数 数组对象名.size(),例9-5(教材例6-20)vector应用举例,20,#include #include using namespace std; /计算数组arr中元素的平均值 double average(const ve

10、ctor ,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 深拷贝与浅拷贝,深拷贝与浅拷贝,浅拷贝 实现对象间数据元素的一一对应复制。 深拷贝 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指对象进行复制。,例9-6(教材例6-21)对象的浅拷贝,23,#include #include us

11、ing 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(0).move(5,10); pointsArray1.element(1).move(15,20); ArrayOfPoints pointsArray2 = pointsArray1;

12、/创建副本 cout Copy of pointsArray1: endl; cout Point_0 of array2: pointsArray2.element(0).getX() , pointsArray2.element(0).getY() endl; cout Point_1 of array2: pointsArray2.element(1).getX() , pointsArray2.element(1).getY() endl;,9.3 深拷贝与浅拷贝,例9-6 (续),25,pointsArray1.element(0).move(25, 30); pointsArray

13、1.element(1).move(35, 40); cout After the moving of pointsArray1: endl; cout Point_0 of array2: pointsArray2.element(0).getX() , pointsArray2.element(0).getY() endl; cout Point_1 of array2: pointsArray2.element(1).getX() , pointsArray2.element(1).getY() endl; return 0; ,9.3 深拷贝与浅拷贝,例9-6 (续),26,运行结果如

14、下: Please enter the number of points:2 Default Constructor called. Default Constructor called. Copy of pointsArray1: Point_0 of array2: 5, 10 Point_1 of array2: 15, 20 After the moving of pointsArray1: Point_0 of array2: 25, 30 Point_1 of array2: 35, 40 Deleting. Destructor called. Destructor called

15、. Deleting. 接下来程序出现异常,也就是运行错误。,9.3 深拷贝与浅拷贝,27,9.3 深拷贝与浅拷贝,拷贝前,拷贝后,例9-6 对象的深拷贝,28,#include #include using namespace std; class Point /类的声明同例6-16 ; class ArrayOfPoints public: ArrayOfPoints(const ArrayOfPoints int main() /同例6-20 ,9.3 深拷贝与浅拷贝,例9-6 (续),29,程序的运行结果如下: Please enter the number of points:2 D

16、efault Constructor called. Default Constructor called. Default Constructor called. Default Constructor called. Copy of pointsArray1: Point_0 of array2: 5, 10 Point_1 of array2: 15, 20 After the moving of pointsArray1: Point_0 of array2: 5, 10 Point_1 of array2: 15, 20 Deleting. Destructor called. Destructor called. Deleting. Destr

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号