《第五章 动态内存分配.ppt》由会员分享,可在线阅读,更多相关《第五章 动态内存分配.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象程序设计(C+描述)成信院 李代伟第第五五章章 动态内存分配动态内存分配面向对象程序设计(C+描述)成信院 李代伟本章主要内容本章主要内容l基本数据类型的初始化基本数据类型的初始化l单个对象内存的动态分配与释放单个对象内存的动态分配与释放l对象数组内存的动态分配与释放对象数组内存的动态分配与释放l使用使用new和和delete在空闲存储区中存储字符串在空闲存储区中存储字符串 l多维数组内存的动态分配与释放多维数组内存的动态分配与释放 15:29:0715:29:072 2面向对象程序设计(C+描述)成信院 李代伟内存分配:静态与动态内存分配:静态与动态l静态内存分配:编译器在处理程序源
2、代码时(即静态内存分配:编译器在处理程序源代码时(即编译时编译时)分配。分配。l动态内存分配:程序动态内存分配:程序执行时执行时调用运行时刻库函数来分配。调用运行时刻库函数来分配。l静态与动态内存分配的三个主要区别:静态与动态内存分配的三个主要区别:静态对象是有名字的变量,我们直接对其进行操作。而静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接地对它动态对象是没有名字的变量,我们通过指针间接地对它进行操作。进行操作。静态对象的分配与释放由编译器自动处理。程序员需要静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要做任何事情。相反,动态
3、对象地理解这一点,但不需要做任何事情。相反,动态对象地分配与释放,必须由程序员显示地管理,相对来说比较分配与释放,必须由程序员显示地管理,相对来说比较容易出错容易出错 内存分配15:29:0715:29:073 3面向对象程序设计(C+描述)成信院 李代伟内存分配:静态与动态内存分配:静态与动态效率与灵活性之间的平衡准则不同效率与灵活性之间的平衡准则不同。静态内存分配。静态内存分配是在程序执行之前进行的因而效率比较高,但是它是在程序执行之前进行的因而效率比较高,但是它缺少灵活性,它要求在程序执行之前就知道所需内缺少灵活性,它要求在程序执行之前就知道所需内存的类型和数量。例如:利用静态分配的字符
4、串数存的类型和数量。例如:利用静态分配的字符串数组,我们无法很容易地处理和存储任意的文本文件组,我们无法很容易地处理和存储任意的文本文件一般来说存储未知数目的元素需要动态内存分配的一般来说存储未知数目的元素需要动态内存分配的灵活性。灵活性。内存分配15:29:0715:29:074 4面向对象程序设计(C+描述)成信院 李代伟概概 述述l在在C语言中进行内存的动态分配与释放,我们使用语言中进行内存的动态分配与释放,我们使用malloc()和和free()函数。函数。lC+中不再使用中不再使用C语言中的语言中的malloc()和和free()函数进行内存的动态函数进行内存的动态分配与释放。因为:
5、分配与释放。因为:malloc()函数在运行时从自由内存中分配存储单元。函数在运行时从自由内存中分配存储单元。在在C+中创建对象时会发生两件事情中创建对象时会发生两件事情:(1)为对象为对象分分配内存配内存;(2)调用构造函数来调用构造函数来初始化初始化那个内存。而那个内存。而构造函数不允许向它传递内存地址来进行初始化。构造函数不允许向它传递内存地址来进行初始化。l在在C+中使用中使用new和和delete来进行内存的动态分配与释放。来进行内存的动态分配与释放。new会触发类对象的构造函数会触发类对象的构造函数delete会触发类对象的析构函数会触发类对象的析构函数 动态内存分配15:29:0
6、715:29:075 5面向对象程序设计(C+描述)成信院 李代伟内存的内存的5个区域个区域 l在在C+中,内存分成中,内存分成5个区,分别是个区,分别是堆、栈、自由存储区、全堆、栈、自由存储区、全局局/静态存储区和常量存储区静态存储区和常量存储区。l栈栈。就是那些由编译器在需要时分配,在不需要时自动清除的。就是那些由编译器在需要时分配,在不需要时自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。变量的存储区。里面的变量通常是局部变量、函数参数等。l堆堆。就是那些由。就是那些由new分配的内存块。它们的释,放编译器不会分配的内存块。它们的释,放编译器不会去管,而是由我们的应用程序去
7、控制,一般一个去管,而是由我们的应用程序去控制,一般一个new要对应一要对应一个个delete。若程序员没有释放掉分配的内存,则在程序结束后,。若程序员没有释放掉分配的内存,则在程序结束后,操作系统会自动回收。但程序没有结束就有内存泄漏。操作系统会自动回收。但程序没有结束就有内存泄漏。l自由存储区自由存储区。就是那些由。就是那些由malloc等分配的内存块,它和堆是十等分配的内存块,它和堆是十分相似的,不过它是用分相似的,不过它是用free来结束自己的生命的(释放内存)。来结束自己的生命的(释放内存)。l全局全局/静态存储静态存储区。全局变量和静态变量被分配到同一块内存区。全局变量和静态变量被
8、分配到同一块内存中,在以前的中,在以前的C语言中,全局变量又分为初始化的和未初始化语言中,全局变量又分为初始化的和未初始化的,在的,在C+里面没有这个区分了,它们共同占用同一块内存区。里面没有这个区分了,它们共同占用同一块内存区。l常量存储区常量存储区。这是一块比较特殊的存储区,它们里面存放的是。这是一块比较特殊的存储区,它们里面存放的是常量,一般不允许修改(当然,通过非正当手段可以修改)。常量,一般不允许修改(当然,通过非正当手段可以修改)。15:29:0715:29:076 6面向对象程序设计(C+描述)成信院 李代伟动态申请内存操作符动态申请内存操作符 newl语法格式:语法格式:类型名
9、类型名T*指针变量名指针变量名P=new 类型名类型名T(初值列表初值列表);l功能:功能:在程序执行期间,申请用于存放在程序执行期间,申请用于存放T类型对象的类型对象的连连续的、未命名的续的、未命名的内存空间,并依初值列表赋以初值。内存空间,并依初值列表赋以初值。l结果值:结果值:成功:成功:T类型的指针,指向新分配的内存。类型的指针,指向新分配的内存。失败:失败:0(NULL)lnew运算符是一个一元运算符。它隐含地生成一个函运算符是一个一元运算符。它隐含地生成一个函数来调用函数数来调用函数operator new(),从这个函数返回被分,从这个函数返回被分配内存对象的指针。配内存对象的指
10、针。动态内存分配15:29:0715:29:077 7面向对象程序设计(C+描述)成信院 李代伟释放内存操作符释放内存操作符deletel语法格式:语法格式:delete 指针变量名指针变量名P;delete 指针变量名指针变量名P;l功能:功能:释放指针释放指针P所指向的内存。所指向的内存。P必须必须是是new操作的返回操作的返回值。值。ldelete表达式首先调用析构函数,然后是否内存(经常调用表达式首先调用析构函数,然后是否内存(经常调用free())。)。l若正在删除的指针是若正在删除的指针是0,则将不发生任何事情,是安全的。,则将不发生任何事情,是安全的。故开发人员经常在删除指针后立
11、即把指针赋值为故开发人员经常在删除指针后立即把指针赋值为0以免对它以免对它删除两次(删除两次(对一个对象删除两次可能会产生某些问题对一个对象删除两次可能会产生某些问题)。)。15:29:0715:29:078 8面向对象程序设计(C+描述)成信院 李代伟使用使用delete void*可能会出错可能会出错l如果想对一个如果想对一个void*类型指针进行类型指针进行delete操作,要注意这将操作,要注意这将可能成为一个程序错误,除非指针所指的内容是非常简单的,可能成为一个程序错误,除非指针所指的内容是非常简单的,因为它将不执行析构函数。因为它将不执行析构函数。l一个一个void*指针被初始化时
12、指向指针被初始化时指向“元元”数据(它没有指向含数据(它没有指向含有析构函数的对象),在调用有析构函数的对象),在调用delete删除删除void*指针时不会指针时不会发生什么错误,因为所需要的仅是释放指针本身(对象)的发生什么错误,因为所需要的仅是释放指针本身(对象)的这块内存。但这样只会释放对象的内存,不调用析构函数,这块内存。但这样只会释放对象的内存,不调用析构函数,从而也就不会释放指针所指向的数据的内存,这样就会从而也就不会释放指针所指向的数据的内存,这样就会引起引起内存泄漏内存泄漏。编译这样的程序时,编译器会认为我们知道所做。编译这样的程序时,编译器会认为我们知道所做的一切,从而编译
13、器不会给出任何警告。的一切,从而编译器不会给出任何警告。l所以对于所以对于void指针必须转换为适当的类型。指针必须转换为适当的类型。15:29:0715:29:079 9面向对象程序设计(C+描述)成信院 李代伟如何为单个对象分配动态内存如何为单个对象分配动态内存l语法格式:语法格式:数据类型数据类型T*指针变量名指针变量名P=new 数据类型数据类型T(初始化列表初始化列表);l示例:示例:int*ptrInt=new int;/One int double*ptrDouble=new double;/One double float*ptrPtrFloat=new float*;/One
14、 pointer-to-floatl不同类型所占用的不同的空间由编译器自动处理。不同类型所占用的不同的空间由编译器自动处理。动态内存分配15:29:0715:29:071010面向对象程序设计(C+描述)成信院 李代伟如何为单个对象分配动态内存如何为单个对象分配动态内存l默认的默认的new还进行检查以确信在传递地址给构造函数之还进行检查以确信在传递地址给构造函数之前内存分配是成功的,故不必显示地确定调用是否成功。前内存分配是成功的,故不必显示地确定调用是否成功。若调用若调用new不能在空闲空间中找到所需的内存,则系统不能在空闲空间中找到所需的内存,则系统就会抛出一个就会抛出一个std:bad_
15、alloc类型的异常。可以在关键类型的异常。可以在关键字后面写上表达式字后面写上表达式(std:nothrow),以强制,以强制operator new()在出现存储溢出时返回在出现存储溢出时返回0(空指针),这样将不再抛出(空指针),这样将不再抛出异常。异常。l使用使用C+关键字关键字new并在后面跟随一个类型,从而在空并在后面跟随一个类型,从而在空闲存储区中分配了这种类型的单个对象的内存空间,最闲存储区中分配了这种类型的单个对象的内存空间,最后获得一个指向被分配内存实例的指针。后获得一个指向被分配内存实例的指针。动态内存分配15:29:0715:29:071111面向对象程序设计(C+描述
16、)成信院 李代伟如何初始化基本类型如何初始化基本类型lC+中很重要的一点就是遵循中很重要的一点就是遵循PITA规则,即规则,即要在创建对象时初始化对象而不是先创建对要在创建对象时初始化对象而不是先创建对象然后再赋值。象然后再赋值。l可以在任何时候初始化由空闲存储区分配的可以在任何时候初始化由空闲存储区分配的单个对象。单个对象。l初始化方法:在特定的类型后面使用圆括号初始化方法:在特定的类型后面使用圆括号内的初始化值来完成。内的初始化值来完成。new 数据类型数据类型T(初始化列表初始化列表);动态内存分配15:29:0715:29:071212面向对象程序设计(C+描述)成信院 李代伟l示例:
17、示例:int*ptrInt=new int(100);double*ptrDouble=new double(1.414);float*ptrFloat=new float(3.1415926F);float*ptrPtrFloat=new float*(ptrFloat);动态内存分配如何初始化基本类型如何初始化基本类型15:29:0715:29:071313面向对象程序设计(C+描述)成信院 李代伟空圆括号的含义空圆括号的含义l在在new表达式中,可以在类型名后使用空表达式中,可以在类型名后使用空圆括号:圆括号:new 数据类型数据类型T();l功能:功能:将初始化为数据类型将初始化为数据
18、类型T的默认值。的默认值。动态内存分配15:29:0715:29:071414面向对象程序设计(C+描述)成信院 李代伟new 数据类型数据类型T;与与new 数据类型数据类型T();的区别的区别l示例:示例:int*ptrInt1=new int;/Value is unknown int*ptrInt1=new int;/Value is zerol说明:第一种情况下,在空闲存储区中创建了一个说明:第一种情况下,在空闲存储区中创建了一个int类型对象,但其值未知。在第二种情况下,在空类型对象,但其值未知。在第二种情况下,在空闲存储区中创建了一个闲存储区中创建了一个int类型对象并初始化为类
19、型对象并初始化为int在在全局作用域中的值(全局作用域中的值(默认值默认值)。而所有的全局)。而所有的全局基本基本类型在默认情况下的类型在默认情况下的 初始值为初始值为0,故第二种情况在,故第二种情况在创建了对象后将其值初始化为创建了对象后将其值初始化为0。动态内存分配15:29:0715:29:071515面向对象程序设计(C+描述)成信院 李代伟如何释放单个对象的空闲空间如何释放单个对象的空闲空间l语法格式:语法格式:delete 指针变量名指针变量名P;指针变量名指针变量名P=NULL;l功能:功能:释放指针释放指针P所指向的内存。所指向的内存。P必须必须是是new操作的返回值。操作的返
20、回值。l删除基于删除基于0的指针(空指针)总是一种安全的指针(空指针)总是一种安全的操作。的操作。动态内存分配15:29:0715:29:071616面向对象程序设计(C+描述)成信院 李代伟如何为对象数组分配空闲空间如何为对象数组分配空闲空间l语法格式:语法格式:数据类型数据类型T*指针变量名指针变量名P=new 数据类型数据类型T元素个数元素个数;l功能:在空闲空间分配对象数组,指针功能:在空闲空间分配对象数组,指针P指向数组的第指向数组的第一个元素。如果在方括号中的表达式的值为一个元素。如果在方括号中的表达式的值为0,则就会,则就会分配没有元素的数组,分配没有元素的数组,new表达式返回
21、的指针是非表达式返回的指针是非0值,值,并且与其他指向任何对象的指针都不同。如果这个值并且与其他指向任何对象的指针都不同。如果这个值在运行期间被确定是无效的,则结果不可预知。在运行期间被确定是无效的,则结果不可预知。动态内存分配15:29:0715:29:071717面向对象程序设计(C+描述)成信院 李代伟如何为对象数组分配空闲空间如何为对象数组分配空闲空间l示例:示例:/Array of 5 ints int*ptrInt=new int5;/Array of 6 doubles int dimension=6;double*ptrDouble=new doubledimension;动态
22、内存分配15:29:0715:29:071818面向对象程序设计(C+描述)成信院 李代伟如何为对象数组分配空闲空间如何为对象数组分配空闲空间l不可能初始化数组:在不可能初始化数组:在C+中并没有语法来真正的初始化空闲中并没有语法来真正的初始化空闲存储区中的各个元素(存储区中的各个元素(不遵循不遵循PITA规则规则)。对于所有的)。对于所有的基本数基本数据类型据类型而言,每个元素的值都是而言,每个元素的值都是未知未知的,所能做的就是在创建的,所能做的就是在创建数组之后,再给每个元素赋值,如下所示:数组之后,再给每个元素赋值,如下所示:int const dimension=5;/Allocat
23、e space for 5 ints,all uninitialized int*ptrInt=new intdimension;/Provide some meaningful values for(int i=0;i dimension;+i)ptrInti=i;说明:空闲存储区中说明:空闲存储区中用户自定义数据类型的数组可以被初始化用户自定义数据类型的数组可以被初始化。动态内存分配15:29:0715:29:071919面向对象程序设计(C+描述)成信院 李代伟如何释放对象数组的空闲空间如何释放对象数组的空闲空间l语法格式:语法格式:delete 指针变量名指针变量名P;l功能:功能:释
24、放空闲存储区中的对象数组内存空间。释放空闲存储区中的对象数组内存空间。l说明:说明:必须用方括号必须用方括号“”来通知编译器这是一个对象数来通知编译器这是一个对象数组,该代码的任务是将从数组创建时存放在某处的组,该代码的任务是将从数组创建时存放在某处的对象数量取回并为数组的所有对象调用析构函数。对象数量取回并为数组的所有对象调用析构函数。当删除用户自定义数据类型的数组时非常重要。当删除用户自定义数据类型的数组时非常重要。同释放单个对象一样,针对包含同释放单个对象一样,针对包含0值的指针使用值的指针使用delete被认为是安全的。被认为是安全的。动态内存分配15:29:0715:29:07202
25、0面向对象程序设计(C+描述)成信院 李代伟保持平衡保持平衡l涉及到涉及到new以及以及delete的主要规则相当简单:的主要规则相当简单:使用使用delete来平衡每一个来平衡每一个new。如果在如果在new语句中使用了方括号(即分配了对象数语句中使用了方括号(即分配了对象数组),必须在组),必须在delete后使用方括号。后使用方括号。l无论何时使用无论何时使用new,一定要确保使用正确的,一定要确保使用正确的delete格式格式。动态内存分配15:29:0715:29:072121面向对象程序设计(C+描述)成信院 李代伟如何使用如何使用new和和delete在空闲存储区中存储字符串在空
26、闲存储区中存储字符串l使用指针数组来跟踪每个字符串。数组存储在空闲存储区中,使用指针数组来跟踪每个字符串。数组存储在空闲存储区中,并且随着字符的输入而自动增长。并且随着字符的输入而自动增长。l为了避免到处使用星号(简化语法),可以使用为了避免到处使用星号(简化语法),可以使用typedef。“string#1”“string#2”“string#3”“string#n”Elem.0Elem.2Elem.3Elem.nchar*char *ptrStringchar*char*char*15:29:0715:29:072222面向对象程序设计(C+描述)成信院 李代伟如何分配和删除多维数组如何分
27、配和删除多维数组l可以为任意维数的数组分配空间,并非仅能为一维数可以为任意维数的数组分配空间,并非仅能为一维数组分配空间。组分配空间。l示例:示例:int rows=3;int const cols=5;double(*ptr)cols=new doublerowscols;/delete ptr;动态内存分配15:29:0715:29:072323面向对象程序设计(C+描述)成信院 李代伟如何分配和删除多维数组如何分配和删除多维数组l示例说明:示例说明:二维数组的元素是一维数组的集合(行)。故为了创建一二维数组的元素是一维数组的集合(行)。故为了创建一个指向一维数组的指针,包含个指向一维数组
28、的指针,包含*ptr的圆括号是必须的。的圆括号是必须的。ptr+1代表了第二个一维数组的开始(第一行,第代表了第二个一维数组的开始(第一行,第0列),列),而不是第二个而不是第二个double元素(第元素(第0行,第一列)。行,第一列)。当使用当使用new从空闲存储区中给数组分配空间时,从空闲存储区中给数组分配空间时,所有的维所有的维数(除了第一维)都必须让编译器知道并且必须是正数数(除了第一维)都必须让编译器知道并且必须是正数。这就是这就是rows可以在运行期间确定,而可以在运行期间确定,而cols必须是常量从必须是常量从而让编译器知道的原因。而让编译器知道的原因。15:29:0715:29
29、:072424面向对象程序设计(C+描述)成信院 李代伟如何分配和删除多维数组如何分配和删除多维数组当删除数组时,注意当删除数组时,注意delete语句的格式与一维数组的格语句的格式与一维数组的格式相同。即式相同。即列的数目不需要指定列的数目不需要指定。使用使用 typedef 可以简化语法可以简化语法。如:。如:int rows=3;int const cols=5;typedef double ONE_DIMcols;ONE_DIM *ptr=new ONE_DIMrows;/delete ptr;15:29:0715:29:072525面向对象程序设计(C+描述)成信院 李代伟命名该空间
30、命名该空间l当使用当使用new在空闲存储区中为一个对象分配空间时,会得到在空闲存储区中为一个对象分配空间时,会得到一个指向对象的指针,然后解引用这个指针来访问该对象。一个指向对象的指针,然后解引用这个指针来访问该对象。但是也可以不使用解引用的指针来访问空闲存储区中的对象,但是也可以不使用解引用的指针来访问空闲存储区中的对象,为此,只需要为此,只需要解引用有解引用有new返回的地址并创建别名返回的地址并创建别名,然后就,然后就可以简单地使用这个别名来引用这个对象。不过因为可以简单地使用这个别名来引用这个对象。不过因为delete需要所分配的空闲存储区的地址,故注意要小心使用取地址需要所分配的空闲
31、存储区的地址,故注意要小心使用取地址运算符运算符&。double&refFreeStore=*new double(3.1416);refFreeStore=3.1415926;/change the content /delete&refFreeStore;/release the space15:29:0715:29:072626面向对象程序设计(C+描述)成信院 李代伟两个程序输出示例两个程序输出示例int main()int*ptrFreeStore=new int(1);int&refFreeStore=*ptrFreeStore;cout refFreeStore endl;ptr
32、FreeStore=new int(2);cout refFreeStore endl;delete&refFreeStore;delete ptrFreeStore;int main()int*ptrFreeStore=new int(1);int*&refPtrFreeStore=ptrFreeStore;cout *refPtrFreeStore endl;delete refPtrFreeStore;ptrFreeStore=new int(2);cout *refPtrFreeStore endl;delete refPtrFreeStore;运行结果:运行结果:11运行结果:运行结
33、果:1215:29:0715:29:072727面向对象程序设计(C+描述)成信院 李代伟例例1 动态创建对象举例动态创建对象举例using namespace std;class Point public:Point()X=Y=0;cout Default Constructor called.n;Point(int xx,int yy)X=xx;Y=yy;cout Constructor called.n;Point()cout Destructor called.n;int GetX()return X;int GetY()return Y;void Move(int x,int y)X
34、=x;Y=y;private:int X,Y;15:29:0715:29:072828面向对象程序设计(C+描述)成信院 李代伟int main()cout Step One:“endl;Point*Ptr1=new Point;delete Ptr1;cout Step Two:“endl;Ptr1=new Point(1,2);delete Ptr1;运行结果:运行结果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor called.2915:29:071
35、5:29:072929面向对象程序设计(C+描述)成信院 李代伟例例2 动态创建对象数组举例动态创建对象数组举例using namespace std;class Point /类的声明同例类的声明同例1,略,略;int main()Point*Ptr=new Point2;/创建对象数组创建对象数组 Ptr0.Move(5,10);/通过指针访问数组元素的成员通过指针访问数组元素的成员 Ptr1.Move(15,20);/通过指针访问数组元素的成员通过指针访问数组元素的成员 cout Deleting.endl;delete Ptr;/删除整个对象数组删除整个对象数组15:29:0715:2
36、9:073030面向对象程序设计(C+描述)成信院 李代伟运行结果:运行结果:Default Constructor called.Default Constructor called.Deleting.Destructor called.Destructor called.3115:29:0715:29:073131面向对象程序设计(C+描述)成信院 李代伟例例3 动态数组类动态数组类using namespace std;class Point /类的声明同例类的声明同例1 ;class ArrayOfPoints public:ArrayOfPoints(int n)numberOfPo
37、ints=n;points=new Pointn;ArrayOfPoints()cout Deleting.endl;numberOfPoints=0;delete points;Point&Element(int n)return pointsn;private:Point*points;int numberOfPoints;3215:29:0715:29:073232面向对象程序设计(C+描述)成信院 李代伟int main()int number;cout number;/创建对象数组创建对象数组 ArrayOfPoints points(number);/通过指针访问数组元素的成员通过
38、指针访问数组元素的成员 points.Element(0).Move(5,10);/通过指针访问数组元素的成员通过指针访问数组元素的成员 points.Element(1).Move(15,20);3315:29:0715:29:073333面向对象程序设计(C+描述)成信院 李代伟运行结果如下:运行结果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Deleting.Destructor called.Destructor called.3415:29:07
39、15:29:073434面向对象程序设计(C+描述)成信院 李代伟动态创建多维数组动态创建多维数组new 类型名类型名T下标表达式下标表达式1下标表达式下标表达式2;如果内存申请成功,如果内存申请成功,new运算返回一个指运算返回一个指向新分配内存首地址的指针,是一个向新分配内存首地址的指针,是一个T类型类型的数组,数组元素的个数为除最左边一维外的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:各维下标表达式的乘积。例如:char(*fp)3;fp=new char23;15:29:0715:29:073535面向对象程序设计(C+描述)成信院 李代伟char(*fp)3;fp
40、fp+1fp00fp01fp02fp10fp11fp123615:29:0715:29:073636面向对象程序设计(C+描述)成信院 李代伟例例4 动态创建多维数组动态创建多维数组using namespace std;int main()float(*cp)98;int i,j,k;cp=new float898;for(i=0;i 8;i+)for(j=0;j 9;j+)for(k=0;k 9;k+)*(*(*(cp+i)+j)+k)=i*100+j*10+k;/通过指针访问数组元素通过指针访问数组元素15:29:0715:29:073737面向对象程序设计(C+描述)成信院 李代伟fo
41、r(i=0;i 8;i+)for(j=0;j 9;j+)for(k=0;k 8;k+)/将指针将指针cp作为数组名使用,作为数组名使用,/通过数组名和下标访问数组元素通过数组名和下标访问数组元素 cout cpijk ;cout endl;cout number;ArrayOfPoints pointsArray1(number);pointsArray1.Element(0).Move(5,10);pointsArray1.Element(1).Move(15,20);ArrayOfPoints pointsArray2(pointsArray1);cout Copy of pointsAr
42、ray1: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;4115:29:0715:29:074141面向对象程序设计(C+描述)成信院 李代伟 pointsArray1.Element(0).Move(25,30);pointsArray1.Element(1).Move(35,
43、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;4215:29:0715:29:074242面向对象程序设计(C+描述)成信院 李代伟运行结果如下:运行结果如下:Please enter the n
44、umber of points:2Default Constructor called.Default Constructor called.Copy of pointsArray1:Point_0 of array2:5,10Point_1 of array2:15,20After the moving of pointsArray1:Point_0 of array2:25,30Point_1 of array2:35,40Deleting.Destructor called.Destructor called.Deleting.接下来程序出现异常,也就是运行错误。接下来程序出现异常,也就
45、是运行错误。4315:29:0715:29:074343面向对象程序设计(C+描述)成信院 李代伟拷贝前拷贝前拷贝后拷贝后pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray1pointsnumberOfPointspointsArray1pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray244浅拷贝浅拷贝15:29:0715:29:074444面向对象程序设计(C+描述)成信院 李代伟例例6 对象的深拷贝对象的深拷贝using namespace std;class Point /类
46、的声明同例类的声明同例1;class ArrayOfPoints public:ArrayOfPoints(ArrayOfPoints&pointsArray);/其它成员同例其它成员同例3;浅拷贝与深拷贝15:29:0715:29:074545面向对象程序设计(C+描述)成信院 李代伟ArrayOfPoints:ArrayOfPoints(ArrayOfPoints&pointsArray)numberOfPoints =pointsArray.numberOfPoints;points=new Point numberOfPoints;for(int i=0;i numberOfPoint
47、s;i+)pointsi.Move(pointsArray.Element(i).GetX(),pointsArray.Element(i).GetY();int main()/同例同例5 4615:29:0715:29:074646面向对象程序设计(C+描述)成信院 李代伟程序的运行结果如下:程序的运行结果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Default Constructor called.Default Constructor called
48、.Copy of pointsArray1:Point_0 of array2:5,10Point_1 of array2:15,20After the moving of pointsArray1:Point_0 of array2:5,10Point_1 of array2:15,20Deleting.Destructor called.Destructor called.Deleting.Destructor called.Destructor called.4715:29:0715:29:074747面向对象程序设计(C+描述)成信院 李代伟拷贝前拷贝前pointsArray1的数组元
49、素占用的内存pointsnumberOfPointspointsArray1拷贝后拷贝后pointsnumberOfPointspointsArray1pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray248深拷贝深拷贝15:29:0715:29:074848面向对象程序设计(C+描述)成信院 李代伟本节课主要介绍了如下内容:本节课主要介绍了如下内容:1 基本数据类型的初始化基本数据类型的初始化 2 单个对象内存的动态分配与释放单个对象内存的动态分配与释放 3 对象数组内存的动态分配与释放对象数组内存的动态分配与释放 4 使用使用new和
50、和delete在空闲存储区中存储字符串在空闲存储区中存储字符串 5 多维数组内存的动态分配与释放多维数组内存的动态分配与释放 本章小结本章小结15:29:0715:29:074949面向对象程序设计(C+描述)成信院 李代伟布置作业布置作业编程并上机验证:编程并上机验证:1、编写一个程序,要求终端用户输入一个、编写一个程序,要求终端用户输入一个int值,然值,然后在空闲存储区中分配一个后在空闲存储区中分配一个double类型的数组,维类型的数组,维数为输入的数为输入的int值,然后用交互输入的值,然后用交互输入的double值来填值来填充数组。完成之后,遍历数组,并显示所有的值,充数组。完成之