动态内存管理技术课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《动态内存管理技术课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 内存 管理 技术 课件
- 资源描述:
-
1、2022-12-51动态内存管理技术动态内存管理技术C C+常见问题常见问题Const的使用的使用内联函数的使用内联函数的使用使用引用使用引用类型转换类型转换异常处理异常处理命名空间命名空间内容提要内容提要2022-12-526.1内联函数的使用内联函数的使用6.1.1 内联函数引入的原因内联函数引入的原因 p调用函数时,要跳到函数的起始地址去执行,调用函数时,要跳到函数的起始地址去执行,执行完函数的代码后,再返回到调用点继续执执行完函数的代码后,再返回到调用点继续执行。行。p这种跳转操作需要这种跳转操作需要保存现场保存现场及返回地址;返回及返回地址;返回时,又需要时,又需要恢复现场恢复现场。
2、p函数调用需要一定的函数调用需要一定的时间开销时间开销和和空间开销,空间开销,这这会影响程序的执行效率。会影响程序的执行效率。外联开销外联开销2022-12-53p对内联函数,编译器会在程序出现内联函数调对内联函数,编译器会在程序出现内联函数调用的地方用的地方用函数体直接进行替换用函数体直接进行替换。p目标程序将目标程序将不存在调用不存在调用问题,也就问题,也就不会产生跳不会产生跳转转的问题,自然就的问题,自然就不存在函数调用所需要的时不存在函数调用所需要的时间和空间开销。间和空间开销。p在编译时用函数代码替换到调用处,如果函数在编译时用函数代码替换到调用处,如果函数代码长度比较长,超过了跳转
3、语句所占空间的代码长度比较长,超过了跳转语句所占空间的长度,这自然会增加整个程序的代码量,进而长度,这自然会增加整个程序的代码量,进而增加了空间的开销增加了空间的开销。实质是用空间换时间。实质是用空间换时间。6.1内联函数的使用内联函数的使用2022-12-546.1.2 内联函数的定义内联函数的定义 例例6_1:smain6_1.cpp/1、全局函数定义为内联函数、全局函数定义为内联函数inline double Show1(double dX)return dX*dX;6.1内联函数的使用内联函数的使用2022-12-55/2、在、在类声明体内实现类声明体内实现的函数不用的函数不用inli
4、ne关键字,关键字,自动是内联函数。自动是内联函数。double Show2(double dX)constreturn dX*dX;6.1内联函数的使用内联函数的使用2022-12-56/3、在函数声明处可加可不加、在函数声明处可加可不加inline关键字。关键字。double Show3(double dX)const;/4、但在实现处必须加、但在实现处必须加inline关键字关键字inline double CPerson:Show3(double dX)constreturn dX*dX;6.1内联函数的使用内联函数的使用2022-12-57p内联函数使用时注意以下几点。内联函数使用时
5、注意以下几点。1、在内联函数中、在内联函数中不允许用循环语句、开关语句不允许用循环语句、开关语句和递归调用语句和递归调用语句等。等。2、内联函数的定义必须出现在第一次调用内联、内联函数的定义必须出现在第一次调用内联函数之前。函数之前。3、在类内部定义并实现的成员函数、在类内部定义并实现的成员函数自动自动是内联是内联函数,但在类内定义成员函数时,如果使用了函数,但在类内定义成员函数时,如果使用了for()、while()、do while()、switch()等等语句,该成员函数会语句,该成员函数会自动转为非内联函数自动转为非内联函数。4、内联函数中、内联函数中不能够有静态数据不能够有静态数据。
6、5、内联函数中、内联函数中不能够有数组说明不能够有数组说明。6.1内联函数的使用内联函数的使用2022-12-586.1.3 内联和非内联函数的选择使用内联和非内联函数的选择使用p内联函数时间开销的减少,内联函数时间开销的减少,以空间的消耗为代以空间的消耗为代价价,而且,而且执行效率的提高也不是绝对的执行效率的提高也不是绝对的。p在决定使用内联函数时要进行适当的取舍。在决定使用内联函数时要进行适当的取舍。p不是所有的函数都适合采用内联函数不是所有的函数都适合采用内联函数。p构造函数和析构函数常常就不适合内联构造函数和析构函数常常就不适合内联,这是,这是因为构造函数和析构函数在编译时,往往会被因
7、为构造函数和析构函数在编译时,往往会被编译器附加一大堆代码。编译器附加一大堆代码。全部内联可以吗?全部内联可以吗?6.1内联函数的使用内联函数的使用2022-12-59p看看看看CStudent类的构造函数:类的构造函数:p例例6_2:构造函数、析构函数往往不适合作构造函数、析构函数往往不适合作内联内联函数。函数。psmain6_2.cpp 构造函数、析构函数最好不要内联。构造函数、析构函数最好不要内联。6.1内联函数的使用内联函数的使用2022-12-510pCStudent()构造函数看起来是构造函数看起来是空的空的,但它可,但它可能含有相当多的代码(与编译器的设计有关)。能含有相当多的代
8、码(与编译器的设计有关)。pCStudent的构造函数,需要构建的构造函数,需要构建4000字节的字节的空间,并且还需要按照基类的要求初始化这些空间,并且还需要按照基类的要求初始化这些空间,因此它包含了一个复杂的创建过程空间,因此它包含了一个复杂的创建过程。p构造函数和析构函数最好都在构造函数和析构函数最好都在类内声明,类外类内声明,类外实现实现。p一般来说,实际编程时一般来说,实际编程时最好最好是不要内联任何函是不要内联任何函数,除非函数确实很小很简单。数,除非函数确实很小很简单。不要内联任何函数不要内联任何函数6.1内联函数的使用内联函数的使用2022-12-5116.2 const的使用
9、的使用pconst意味着分配了一块意味着分配了一块不可改变的内存不可改变的内存。p用用const定义或说明常类型量时定义或说明常类型量时必须初始化必须初始化。p常类型量,也就是常量。常类型量,也就是常量。pconst更重要的用途则在于更重要的用途则在于说明函数参数以及说明函数参数以及函数返回类型函数返回类型。函数参数函数参数2022-12-512pconst主要有以下几种用法:主要有以下几种用法:1、const说明值常量。说明值常量。2、const说明指针。说明指针。3、const说明函数参数及其返回值。说明函数参数及其返回值。4、const说明类中的常量和成员函数。说明类中的常量和成员函数。
10、6.2 const的使用的使用2022-12-5136.2.1 const说明值常量说明值常量 1、说明、说明符号常量符号常量,表明符号代表的是一个常量,表明符号代表的是一个常量,说明格式如下:说明格式如下:pdouble const PI=12;pconst double PI=12;2、说明、说明数组常量数组常量,说明格式如下:,说明格式如下:pconst int I_ARRAY=3,2,1;3、说明、说明对象常量对象常量,说明格式如下:,说明格式如下:pconst CInline1 oC1,oC2;p在一排逗号隔开的变量中,在一排逗号隔开的变量中,只需要一个只需要一个const就行了就行
11、了在前、在后定义都可以。在前、在后定义都可以。6.2 const的使用的使用2022-12-514const与与C语言语言#define的差别的差别:p#define PI 3.14p无参宏不是符号常量无参宏不是符号常量,它没有数据类型,没有,它没有数据类型,没有值,在内存中不分配地址。它是在预处理时作值,在内存中不分配地址。它是在预处理时作宏替换,不作类型检查。宏替换,不作类型检查。p而而const定义的常量是符号常量定义的常量是符号常量,有数据类型,有数据类型,有值,且其值不可改变,在内存中有地址,编有值,且其值不可改变,在内存中有地址,编译时要作类型检查。译时要作类型检查。6.2 con
12、st的使用的使用2022-12-5156.2.2 const与指针与指针 指针涉及三个东西:指针涉及三个东西:p一个是一个是指针变量本身指针变量本身;p另一个是另一个是指针指针指针变量中所存放的值;指针变量中所存放的值;p再一个就是再一个就是指针所指向的对象指针所指向的对象。6.2 const的使用的使用2022-12-516p指针其实就是地址指针其实就是地址,它代表的是指针变量中存,它代表的是指针变量中存放的地址值;放的地址值;p而而指针变量是指用来存放指针的一个变量指针变量是指用来存放指针的一个变量,它,它用来存放地址;用来存放地址;p注意注意:指针变量本身也有地址,有存储单元;:指针变量
13、本身也有地址,有存储单元;p指针所指向的对象是指那片空间所指针所指向的对象是指那片空间所“存放的东存放的东西西”。p指针变量本身的地址,与指针变量所指向的对指针变量本身的地址,与指针变量所指向的对象的存储地址是两个不同的地址。象的存储地址是两个不同的地址。6.2 const的使用的使用2022-12-5176.2 const的使用的使用2022-12-518pconst和指针变量的典型组合有以下三种情况:和指针变量的典型组合有以下三种情况:1、指向常量的指针、指向常量的指针 const int*p;2、常指针、常指针 char*const pc=a;3、指向常量的常指针、指向常量的常指针con
14、st char*const pc=a;6.2 const的使用的使用2022-12-519 const int *p;char *const pc=a;const char *const pc=a;p画一条垂直线穿过指针声明中的星号(画一条垂直线穿过指针声明中的星号(*)位)位置。置。p如果如果const出现在线的左边,则指针指向的对出现在线的左边,则指针指向的对象为常量;象为常量;p如果如果const出现在线的右边,则指针本身为常出现在线的右边,则指针本身为常量;量;p如果如果const在线的两边都出现,则二者都是常在线的两边都出现,则二者都是常量,是指向常量的常指针。量,是指向常量的常指针
15、。6.2 const的使用的使用 2022-12-5201 指向常量的指针指向常量的指针 p指针指向一个指针指向一个不可改变的量。不可改变的量。指向常量。指向常量。p在声明时在声明时可以不初始化。可以不初始化。p该指针可以指向这个常量,也可以指向另一个该指针可以指向这个常量,也可以指向另一个常量。常量。p指针变量里的指针值是可以改变的;指针变量里的指针值是可以改变的;p但某一个具体指针值(即:某个指针)但某一个具体指针值(即:某个指针)所指向所指向的那个对象则是不可以改变的的那个对象则是不可以改变的。对象不可改变。对象不可改变。6.2 const的使用的使用2022-12-521p它也可以指向
16、变量;它也可以指向变量;p从指针角度而言,所指向的是一个常量,通过从指针角度而言,所指向的是一个常量,通过该指针该指针不能修改不能修改它所指向的对象;它所指向的对象;p该指针变量可以存放常量地址也可以存放变量该指针变量可以存放常量地址也可以存放变量地址。地址。对象不可改变。对象不可改变。6.2 const的使用的使用2022-12-522const char*pc=ABCD;pc3=a;/不可以。不可以。pc=“EFGH”;/可以可以/step是一个指向常量的指针数组是一个指向常量的指针数组 const char*step3=left,right,top;step2=skip;/可以。可以。s
17、tep21=i;/不可以。不可以。6.2 const的使用的使用2022-12-5232 常指针常指针 *const=;p指针变量里面存放的是个常量,称为指针变量里面存放的是个常量,称为常指针常指针,指针变量里面装的是一个固定值,指针变量里面装的是一个固定值,在定义时必在定义时必须初始化。须初始化。p常指针一旦初始化后,不能够再指向其他内存常指针一旦初始化后,不能够再指向其他内存单元。单元。p通过常指针通过常指针可以修改它所指向的内存单元的内可以修改它所指向的内存单元的内容容,也就是修改常指针所指向的对象。,也就是修改常指针所指向的对象。6.2 const的使用的使用2022-12-524ch
18、ar*const pc=ABCD;/常指针常指针pc3=a;/可以。可以。pc=EFGH;/不可以不可以/step是一个常指针数组是一个常指针数组 char*const step3=left,right,top;step2=skip;/不可以。不可以。step21=i;/可以。可以。6.2 const的使用的使用2022-12-5253 指向常量的常指针指向常量的常指针 p指针本身及指针所指向的对象都不可改变。二指针本身及指针所指向的对象都不可改变。二者都要声明为者都要声明为 const。p在声明时必须初始化。在声明时必须初始化。p指针本身及其指向的对象均不能改变。指针本身及其指向的对象均不能
19、改变。pconst char*const pc=asdf;ppc3=a;/不可以。不可以。ppc=ABCD;/不可以。不可以。6.2 const的使用的使用2022-12-5266.2.3 const说明函数参数和返回值说明函数参数和返回值p是是const最重要的应用。最重要的应用。p在在值传递场合值传递场合不必用不必用const。p用用const去修饰用去修饰用指针和引用传递的函数参数指针和引用传递的函数参数,是安全的。是安全的。pconst修饰函数的返回值。修饰函数的返回值。安全的安全的6.2 const的使用的使用2022-12-527void Func(const char*lpszC
20、har);void Func(char const*lpszChar);p/以上二者等价。以上二者等价。p/参数是对象的常引用,返回值也是一个对象参数是对象的常引用,返回值也是一个对象的常引用。的常引用。pconst CStudent&Func(const CStudent&oCStudent);p对返回值使用对返回值使用const也有可能也有可能提高函数的安全提高函数的安全性和效率。性和效率。6.2 const的使用的使用2022-12-5286.2.4 类中的类中的constp在类中,在类中,const的使用也比较广。的使用也比较广。p它可以用于修饰类中的它可以用于修饰类中的成员函数和成员
21、数据成员函数和成员数据。主要应用主要应用6.2 const的使用的使用2022-12-5291 常成员函数常成员函数 p不可以改变对象数据成员的函数。不可以改变对象数据成员的函数。在一般成员在一般成员函数后面加上函数后面加上const即可即可。1、用、用const关键词修饰一个成员函数,说明该关键词修饰一个成员函数,说明该成员函数成员函数是是“只读只读”的的。2、只有常成员函数可以操作常对象,、只有常成员函数可以操作常对象,常对象只常对象只能调用常成员函数能调用常成员函数(const成员函数)。成员函数)。3、一般对象不但可以调用一般成员函数,也可、一般对象不但可以调用一般成员函数,也可以调用
22、常成员函数。以调用常成员函数。6.2 const的使用的使用2022-12-530p例例6_3:常对象只能够调用常成员函数,不能够常对象只能够调用常成员函数,不能够调用一般成员函数,而一般对象可以调用所有调用一般成员函数,而一般对象可以调用所有的成员函数。的成员函数。s6_3sclass6_3_T.h s6_3sclass6_3_point.cpp s6_3smain6_3.cpp运行结果运行结果 一般成员函数调用:一般成员函数调用:1 2一般成员函数调用:一般成员函数调用:2 3 常成员函数调用:常成员函数调用:3 3 6.2 const的使用的使用2022-12-531p例子表明:例子表明
23、:仅在仅在const方面有不同的成员函数方面有不同的成员函数是可以重载的,是可以重载的,编译器能够正确区分这两个函编译器能够正确区分这两个函数。数。p而对调用对象来说,一般对象而对调用对象来说,一般对象优先调用重载的优先调用重载的一般函数,其次才是一般函数,其次才是const函数函数;p常对象(常对象(const对象)则只能够调用对象)则只能够调用const函函数,不能够调用一般函数。数,不能够调用一般函数。p对于一般对象对于一般对象,当调用一般成员函数不成功时,当调用一般成员函数不成功时,系统自动会转入对常成员函数的调用。系统自动会转入对常成员函数的调用。6.2 const的使用的使用202
24、2-12-5322 常数据成员常数据成员p若一个数据成员的前面用了关键词若一个数据成员的前面用了关键词const修饰修饰符,则该数据成员为常数据成员。符,则该数据成员为常数据成员。pconst 型的数据型的数据必须初始化,必须初始化,且不能修改,它且不能修改,它是常数据成员。是常数据成员。p常数据成员的初始化方式常数据成员的初始化方式在定义对象时,在定义对象时,通过在构造函数后面加上成员通过在构造函数后面加上成员初始化列表初始化列表来完来完成的。成的。psmain6_4.cpp 6.2 const的使用的使用2022-12-533class CPoint/CPoint类类private:int
25、 m_x;/x坐标坐标const int m_y;/y坐标,常数据成员坐标,常数据成员static const int m_z;/z坐标,静态常数据成员坐标,静态常数据成员;const int CPoint:m_z=0;/静态数据成员的初始化方式。静态数据成员的初始化方式。/构造函数,构造函数,m_y采用了初始化表的方式初始化。采用了初始化表的方式初始化。CPoint:CPoint(int x,int y):m_y(y)m_x=x;/正确。正确。/m_y=y;/错。错。6.2 const的使用的使用2022-12-534p在在CPoint中设置了空间坐标中的中设置了空间坐标中的m_x、m_y和
展开阅读全文