复制构造函数引用this指针静态成员.ppt

上传人:marr****208 文档编号:133881262 上传时间:2020-05-31 格式:PPT 页数:54 大小:572.50KB
返回 下载 相关 举报
复制构造函数引用this指针静态成员.ppt_第1页
第1页 / 共54页
复制构造函数引用this指针静态成员.ppt_第2页
第2页 / 共54页
复制构造函数引用this指针静态成员.ppt_第3页
第3页 / 共54页
复制构造函数引用this指针静态成员.ppt_第4页
第4页 / 共54页
复制构造函数引用this指针静态成员.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《复制构造函数引用this指针静态成员.ppt》由会员分享,可在线阅读,更多相关《复制构造函数引用this指针静态成员.ppt(54页珍藏版)》请在金锄头文库上搜索。

1、 动态内存分配回收 new和delete默认参数值的构造函数引用的定义和使用拷贝构造函数特殊的this指针 1 2 复习 构造函数和析构函数 1 构造函数 类的特殊成员函数 主要用于初始化对象 其特点 1 在建立对象时 系统自动调用构造函数 构造函数不能被程序员显式调用 2 构造函数的名字必须与相应的类同名 3 构造函数没有返回值类型 可以有任意类型的参数 不能包含return语句 4 若在定义类时未定义构造函数 则系统自动生成默认构造函数 空函数 若程序已经定义构造函数 系统不再提供默认构造函数 3 构造函数的作用 不仅完成了对象数据成员的初始化 同时检查了初始化值的有效性 如果某个初始化参

2、数值错误 就用一个最接近的合法的值去替换它 如果不定义任何构造函数 编译器会自动产生一个什么也不作的无参数的构造函数 只要定义了一个构造函数 就不再提供默认的构造函数 4 构建对象的顺序 创建对象的唯一途径是调用构造函数1 所有全局对象在主函数main之前构造全局对象之间顺序不定2 局部和静态对象以声明的顺序构造静态对象只被构造一次3 析构函数以与构造函数相反的顺序被调用 5 构造函数何时被调用 在有对象生成时 系统要调用相应构造函数 如 定义新的对象CDATEdate1 用new操作符给对象指针动态分配存储空间时特殊用法不会调用构造函数 创建对象引用时创建对象指针时 6 析构函数何时被调用

3、撤销对象时自动调用析构函数自动撤销 局部类型变量 全局 静态类型变量主动撤销 用new操作符为对象指针动态分配空间 必须用delete释放析构函数调用次序和构造函数次序相反 7 构造函数具有普通成员函数几乎所有的性能可以在类内部 外部定义可以带默认值 可以有多个参数 可以不带参数 可以重载 构造函数的定义 8 构造函数的重载 一个类可以具有多个构造函数 这使得类可以根据不同的要求进行不同的初始化 系统会自动调用形参表与实参表匹配的构造函数如果创建对象时没有向构造函数传递实参 则在对象名后面不要加括号 否则是函数原型说明 9 默认的构造函数 如果类定义中没有构造函数 系统会自动产生默认的构造函数

4、 参数表和函数体都为空 如果类中定义了构造函数 系统不会再产生默认的构造函数 创建对象时 没有相应的构造函数 就会产生错误 带默认参数的函数 在函数定义和函数原型说明中 可以给函数的参数指定值 这种函数称为具有缺省参数值的函数 在进行函数调用时 如果给出了实参值 则将实参传递给对应的形参 如果没有给出实参值 则利用指定的参数的缺省值进行调用 10 具有缺省参数值的延时函数 voidDelay intn 1000 A for n 0 n voidmain void cout 延时500个单位时间 n Delay 500 Bcout 延时1000个单位时间 n Delay C 11 使用具有缺省值

5、参数的函数时 注意以下几点 1 除了在函数定义时可指定参数的缺省值之外 在函数原型说明中也可指定缺省参数值 此时还可以省去参数名 另外在不同的作用域内可以为同一个函数指定不同的缺省值 但在同一作用域内 同一个函数只能指定一次缺省值 2 参数的缺省值可以是表达式 但表达式必须有确定的值 12 设计一程序 输入圆柱体的半径和高度 求出圆柱体的体积 floatconstPI 3 1416floatVolume floatr floath 10 Avoidmain void floatr h cout r h cout r cout 第二个圆柱体的体积为 Volume r n floatVolume

6、float 5 float 20 Bcout 第三个圆柱体的体积为 Volume n C floatVolume floatr floath D return PI r r h 13 3 所有的参数可以全部都具有缺省值 也可以只是部分参数具有缺省值 但此时具有缺省值的参数必须位于参数表中的最右边 调用带缺省参数的函数时 编译器按从左向右的顺序将实参与形参结合 若未指定足够的实参 则编译器按顺序用函数原型中的缺省值来补足所缺的实参 例如 有如下函数声明 intspecial intx 5 floaty 7 8 以下调用都是合法的 special 100 79 8 special 25 speci

7、al 换句话说 在函数原型中 所有的缺省参数均放在参数表的右半部分 并且 在调用函数时 若某个参数省略 则其后的参数皆应省略而采用缺省值 如intfun intj intm 7 intk special 79 8 allerror 14 15 具有默认值的构造函数 必须遵守具有默认值的函数的定义要求一般的类中只有一个具有默认值的构造函数 否则容易产生二义性 动态内存分配 C 的内存划分为四个区 全局数据区 全局变量 静态数据 常量代码区 所有函数代码栈区 局部变量 函数参数 返回数据 返回地址堆区 自由存储区 允许程序在运行时申请栈区中的内存分配 回收由系统负责 堆区中分配和回收由程序操作 C

8、语言中使用函数malloc 申请 free 回收C 中使用操作符new delete来申请 释放 C语言中 malloc 的缺点必须计算分配存储空间的大小 对待分配变量的类型一无所知 仅返回一个void指针 必须强制转换为适当的类型才能赋给ptr structdate ptr ptr structdate malloc sizeof structdate 动态内存分配 C 中 new运算符可以为所创建的指针变量动态地分配存储空间 而运算符delete则用于释放动态分配的存储空间 使用new运算符的一般格式为 new 初始值 或 new 第一种形式为所指向的数据分配大小为sizeof 个字节的连

9、续存储空间 初始值表示为所分配的存储空间指定初始值 第二种形式为所指向的数据分配指定大小的数组空间 为整型变量或常量 例如 float p5 newfloat 2 5 p5为指向浮点型数据的指针 此浮点数值为2 5intc 10 int p6 newint c int p2 newint 4 8 在内存中申请能存放10个整型数的空间 p6指向空间开始的地方 在内存中申请能存放8X4个整型数的空间 p2指向空间开始的地方 对于上述两种情形 如果动态分配不成功 则new运算符返回NULL 0 如果成功分配 则new运算符返回所分配的存储空间的首地址 并将该地址赋给 使用delete的一般格式为 d

10、elete 或delete 第一种格式为将动态分配给的内存空间归还给系统 第二种格式为将动态分配给的数组空间归还给系统 int stringptr1 newint 3 int stringptr2 newint 100 deletestringptr1 删除一个整数delete stringptr2 删除数组 使用new进行动态分配 具有内置的长度计算 类型转换 安全检查注意 用malloc申请的存储空间只能用free函数释放 用new申请的只能用delete释放两种机制绝对不能混用 动态内存分配优点 注意 不论是用malloc 还是new操作符 申请了空间 一定记住要在使用完后释放 如果只申

11、请 不释放 堆中的可用空间会逐渐变少 对以后程序的运行会产生无法预料的影响 24 引用的定义和使用 引用是另一个变量的别名 对这两个名字的任意操作都具有相同的结果 引用变量依附于另一个变量而定义 定义引用类型变量的一般格式为 其中为引用类型的变量 而必须是已经定义过的且与引用变量同类型的变量 定义了一个引用 就使一个变量与它建立了联系 这个引用和那个变量就永久地联系起来了 而且再也不允许与其他变量建立联系 在定义一个引用变量时 编译系统并不会为其单独分配存储空间 25 引用举例 includevoidmain intk int 提示 定义引用时 必须同时进行初始化 不能等定义完后再赋值 运行结

12、果 k 30j 30k 80j 80addressofk 0 x0065FDF4addressofj 0 x0065FDF4 26 对于引用类型的变量时 要注意如下几个问题 1 在定义引用类型的变量时 必须用同类型的已经定义的变量对它进行初始化 例如 intactualint 123 int 引用与第三个数组元素关联 27 3 可以定义指针类型的引用 int pi newint int 4 可以定义对引用类型变量的引用 但不能定义引用的引用 也不能定义引用指针和引用数组 5 有空指针 但没有空引用和void类型的引用 28 2 引用作为函数参数 引用的一个主要用途是将引用作为函数的参数 C语言

13、中有两种向函数传递参数的方式 传递变量的值给函数 传递指向变量的一个指针C 中 第三种方法 把变量的引用传递给函数注意 在调用参数为引用类型的函数时 引用类型的形参所对应的实参必须为变量 不能为常量 29 2 引用参数 回顾 用传地址方式交换两个变量的值 includevoidswap int m int n inttemp temp m m n n temp voidmain inta 5 b 10 cout a a b b endl swap 运行结果 a 5b 10a 10b 5 30 采用C 提供的 引用参数 方式 调用时更容易理解 更方便 includevoidswap int 分析

14、 该程序运行结果同上页 当程序中调用swap 时 实参a和b分别初始化引用m和n 在函数swap 中 对m和n的访问 实际上是对a和b的访问 31 在调用引用类型参数的函数时 对引用类型的参数的操作实际上就是对传递给它的实参的操作 而不需要将实参拷贝一个副本给形参 因此从程序的执行效率上看 引用作为参数 在运行过程中可以节省内存资源 通常将占用存储空间较大的类型的形参设置为引用类型 如果需要把对象作为参数传递给函数 使用引用方式既可以节省内存 又避免了多次调用构造 析构函数 节省了时间 如果不希望调用时所用的实参被修改 可以在定义函数时 将其参数加上const限制例如 intfunc cons

15、t m 32 2 拷贝构造函数 当用一个已有的对象对正在创建的对象进行初始化时 调用拷贝构造函数函数 能完成拷贝功能的构造函数称为拷贝构造函数 定义拷贝构造函数的格式如下 const C 中的拷贝构造函数有两种形式 1 系统自动产生 P39例2 7 33 classCPoint2 intx y public CPoint2 x 0 y 0 CPoint2 intvx intvy x vx y vy voidPrint cout x t y n voidmain10 11 CPoint2pt1 100 200 CPoint2pt2 pt1 ACPoint2pt3 pt1 Bpt3 pt2 Cpt

16、1 Print pt2 Print pt3 Print A行和B行调用 系统自动产生的复制构造函数 Cpoint Cpoint Cpoint 34 classCPoint intx y public CPoint x 0 y 0 CPoint intvx intvy x vx y vy CPoint CPoint voidmain Cpointpt1 100 200 pt1 Print CPointpt2 pt1 Apt2 Print CPointpt3 pt1 Bpt3 Print cout 标志 n pt3 pt2 C 用户自定义构造函数 35 自定义拷贝构造函数 系统自动产生的拷贝构造函数能够处理绝大多数问题 但有些问题却必须利用用户自定义的拷贝构造函数 36 例 自定义的拷贝构造函数处理 指针悬挂 问题 includeclassCA char ps public CA ps 0 CA char s 为指针ps动态分配存储空间 ps newchar strlen s 1 strcpy ps s CA CA 37 若不定义拷贝构造函数 voidmain void CAs1 Chin

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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