ImageVerifierCode 换一换
格式:PPT , 页数:36 ,大小:433.50KB ,
资源ID:5753828      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-5753828.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第三章 关于类和对象的进一步讨论.ppt)为本站会员(dzzj200808)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

第三章 关于类和对象的进一步讨论.ppt

1、第三章 关于类和对象的进一步讨论,3.1 构造函数 3.2 析构函数 3.3 调用构造函数和析构函数的顺序 3.4 对象数组 3.5 对象指针 3.6 共用数据的保护 3.7对象的动态建立与释放 3.8 对象的赋值与复制 3.9 静态成员 3.10 友元 3.11 类模板,3.1构造函数,3.1.1对象的初始化 3.1.2构造函数的作用 3.1.3带参数的构造函数 3.1.4用参数初始化表对数据成员初始化 3.1.5构造函数的重载 3.1.6使用默认参数的构造函数,3.1.1对象的初始化,class Time public:int hour; int minute;int sec; void

2、settime(); void showtime(); ; void Time:settime() cinhourminutesec; void Time:showtime() couthour“:”minute”:”secendl; int main() Time t;Time t(2,3,5);,3.1.1对象的初始化,在建立一个对象时,往往要对对象初始化,则初始化的工作就要有构造函数完成注意: 1.类的数据成员是不能在声明类时初始化。 2.如果一个类中的所有成员都是公用的,则可以在定义对象时初始化。 Time t=2,4,5;,3.1.2构造函数的作用,将以上例子改为构造函数完成初始化。

3、 构造函数是一种特殊的成员函数,构造函数的名字必须与类名相同,不具有函数的返回值,构造函数不需用户调用,而是在建立类对象的时候自动调用的,用以完成对象的初始化工作。 有关构造函数的几点说明: 1.什么时候调用构造函数 2.构造函数没有返回值,不需要函数值的类型 3.构造函数不需要用户调用,也不能被用户调用。 4.在构造函数的函数体内不仅可以对数据成员赋初值,也可以包含其他语句,但是不提倡在构造函数中加入与初始化无关的内容。 5.如果用户没有定义构造函数,则C+系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作 练习构造函数的使用。,3.1.3带参数的构造函

4、数,构造函数可以带参数,也可以不带参数。 说明:1 带参的构造函数中的形参,其对应的实参在定义对象时给定。 2 用这种方法可以方便的实现对不同的对象实现不同的初始化。,3.1.4用参数初始化表对数据成员初始化,即在原来函数首部的末尾加一个冒号,然后列出参数的初始化列表 如: Time:Time(int h,int m ,int s) :hour(h),minute(m),sec(s) ,3.1.5构造函数的重载,1.默认构造函数 2.如果在建立对象时选用的是无参的构造函数,应注意正确书写定义对象的语句。 如:Time t();是错误的Time t;是正确的。 3.构造函数虽然可以有多个,但是对

5、于一个对象来说,只能执行一个。,3.1.6使用默认参数的构造函数,说明: 1.应该在什么地方使用构造函数 2.在声明构造函数时,形参名可以省略。 3.如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给 4.定义了默认参数的构造函数后不能再定义函数的重载。,3.2 析构函数,析构函数也是一个特殊的成员函数,它的作用与构造函数正好相反,它的名字是类名的前面加一个“”。 执行:在对象的生命期结束时自动执行析构函数。 说明: 1.在函数中定义的对象,在函数调用结束时自动执行析构函数 2. static局部对象 3.全局对象 4.new运算符动态的建立一个对象,dele

6、te运算符释放该对象时调用该对象的析构函数。 5.析构函数没有返回值,没有函数类型,也没有函数的参数,因此析构函数只有一个,不可以重载 例题3.5: 析构函数的执行。,3.3 调用构造函数和析构函数的顺序,先构造的后析构,后构造的先析构。 析够函数的执行顺序与构造函数正好相反。,3.4 对象数组,1.在建立数组时同样需要调用构造函数,如果构造函数只有一个参数,在定义数组时可以直接提供实参以实现初始化。 2.如果构造函数有多个参数,则不能用在定义数组时直接提供所有参数的方法。编译只为构造函数传递一个参数。 3.定义方法 Time t3= Time(1,2,3),Time(2,3,4),Time(

7、3,4,5);(例题3.6),#include “iostream.h“ class Time public:int hour; int minute;int sec; void settime(); void showtime(); Time (int h,int m,int s); ; void Time:settime() cinhourminutesec; void Time:showtime() couthour“:“minute“:“secendl; Time:Time(int h,int m,int s) hour=h; minute=m;sec=s; int main() Ti

8、me t3=Time(1,3,4),Time(3,4,5),Time(5,6,7);t0.showtime(); return 0; ,3.5 对象指针,3.5.1 指向对象的指针 Time t(1,2,3); Time *p=,3.5.2 指向对象成员的指针,1.指向对象数据成员的指针 (同指向一般变量的指针) 2.指向对象成员函数的指针(公有函数) 复习:指向函数的指针的使用方法: 数据类型名 (类名:*指针名)(参数表) 如:void (Time:*p)(); 指针变量赋值:指针变量名= 3.5.3 this指针,3.6 共用数据的保护,3.6.1 常对象 3.6.2 常对象成员 3.6

9、.3 指向对象的常指针 3.6.4 指向常对象的指针变量 3.6.5 对象的常引用,3.6.1 常对象,Time const t(1,2,3); 或者const Time t(1,2,3); 说明:1. 常对象中的数据成员为常变量且必须有初始值 2. 常对象的所有数据成员的值不须被修改 3.定义的一般格式 4. 如果一个对象声明为常对象,则不能调用该对象的非const型的成员函数。,3.6.2 常对象成员,1.常数据成员 const int hour; 说明:1) 常数据成员的值是不能改变的。只能通过构造函数的初始化列表进行初始化。 2)在类中声明了一个数据成员为常数据成员后,该类的所有对象中

10、的该数据成员的值都是不可以改变的,但是不同对象的该数据成员的值可以是不同的。 2.常成员函数 常成员函数的声明:void showtime() const; 一般的成员函数可以引用本类中的非const数据成员,也可以修改他们,如果将成员函数声明为const成员函数,则只能引用本类中的数据成员,而不能修改他们。,常成员函数可以引用const数据成员,也可以引用非const数据成员,const数据成员可以被const成员函数引用,也可以被非const成员函数引用。具体情况如下:,3.6.3指向对象的常指针,指针变量声明为const型并且将之初始化,这样指针值始终为其初值,不能改变,即指针的指向不能

11、改变。 格式:类型名 * const 指针变量名=对象地址,3.6.4指向常对象的指针变量,(1)如果一个对象已被声明为常对象,只能用指向常对象的指针变量指向它,而不能用一般的指针变量指向它。 (2) 如果定义了一个指向常对象的指针变量,则可以使它指向一个非const的对象,但是其指向的对象是不能通过指针来改变的。 (3)指向常对象的指针最常用于函数的参数,目的是在保护形参指针所指向的对象。,3.6.5 对象的常引用,函数参数为常引用,则不能改变参数的值 例题3.8,3.6. 6const型数据的小结,3.7对象的动态建立与释放,3.8 对象的赋值与复制 赋值:1.同一个类的对象之间可以相互赋

12、值 2.对象的赋值只对其中的数据成员赋值 3.类的对象成员中不能包含动态分配的数据。,对象的复制,对象的复制:用一个已有的对象复制出多个完全相同的对象。如:Time t1(t);即用一个对象去初始化一个新对象。这时需要调用一个特殊的构造函数复制构造函数。(复制初始化构造函数) 一般格式: 类名:类名(const 类名 &t ) 说明:1 只有一个参数,只能是本类的对象 2参数采用引用的形式。 3.复制构造函数的作用就是将实参对象的各数据成员的值赋值给新的对象中的数据成员。,普通构造函数与复制构造函数的区别: 1)在形式上, 类名(形参表列); 类名(类名 & 对象名) 2)在建立对象时,实参类

13、型不同,系统会根据实参的类型决定调用普通构造函数还是复制构造函数。 3)什么情况下调用复制构造函数 A)程序中需要新建立一个对象且用一个对象初始化另一个对象。 B)当函数的参数为类的对象时 C)当函数的返回值是对象时。,3.9 静态成员,我们知道,如果n个同类对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,故不相干,但是有时候我们希望有某一个或某几个数据成员为所有对象所共有。这样可以实现数据共享。这时,不要用全局变量,用静态的数据成员。 3.9.1 静态数据成员:静态成员是一特殊的数据成员,以关键字static开头。 Class Box static int heigh

14、t; int width,length; public: int volume(); ; 这时,heigth不只属于某个对象的数据成员,而是为所有的该类对象所共有。所有对象都可以引用它。静态对象在内存中之占一份空间,所有对象的静态数据成员的值都是一样的。,说明:,1)静态成员的内存空间 2)静态数据成员的生存期 3)静态数据成员可以初始化,但是只能在类体外进行初始化: 格式:数据类型 类名:静态数据成员=数值 注:不能用初始化类表对静态成员初始化。 4)静态数据成员即可以用对象名引用,也可以不用类名引用。 5)有了静态数据成员,各对象之间的数据有了沟通的渠道。 举例:103页,3.9.2 静态

15、成员函数,例题 3.10 1.成员函数也可以定义成静态的 2.静态成员函数跟静态成员一样也是类的一部分,而不是对象的一部分。 3.如果要在类外调用公用的静态成员函数,要用类名和域运算符:,也允许通过对象名调用静态成员函数。 4.静态成员函数没有this指针。既然它没有指向某一个对象,就无法对一个对象中的非静态成员进行默认访问 5.静态成员不能访问本类中的非静态成员,只能访问静态成员。,3.10 友元,友元分为两种:友元函数和友元类 3.10.1 友元函数 1.普通函数作为友元 一般来说,普通函数中不允许访问类中的私有成员,但是一旦声明为类的友元以后,普通函数就可以通过对象名访问类中的私有成员了

16、。 注意:1)声明为友元的关键字是friend 2)在类内声明为友元函数,但它不是成员函数。3)在友元函数中访问私有成员需要通过对象名,#include “iostream.h“ class Time int hour; int minute;int sec; public:void settime();friend void display(Time ,void Time:showtime() couthour“:“minute“:“secendl; Time:Time(int h,int m, int s) hour=h;minute=m; sec=s; void display(Time

17、 ,2.成员函数作为友元,friend函数不仅可以是一般函数,而且可以是另一个类中的成员函数。 说明: 1)类的提前引用格式:class 类名; )类的提前引用不可以定义类对象,只能在正式 声明类以后才可以定义类对象。 ) 友元函数对私有成员的引用必须加上对象名。 4 ) 一个函数可以被多个类声明为“朋友”,这样就 可以引用多个类中的私有成员,3.10.2 友元类,不仅可以将一个函数声明为一个类的朋友,而且可以将一个类声明为另一个类的朋友。 如:在A类的定义体中 声明 friend B; 则B类就是A类的友元类,此时B类中的所有函数都是A类的友元函数,可以访问A类中的所有成员。 如:frien

18、d Time;,3.11 类模板 例子: class compare_int int x, y; public: compare_int(T a, T b) x=a; y=b; int max() return (xy)?x:y; int min() return (xy)?x:y; ;,说明: 1.在声明类模板时要增加一行template 或者template (不要有分号) 2.类模板的使用。在指定对象时要指定类型参数 Compare cml(4,5); 3.如果在类模板外定义定义成员函数,应当写成类模板的形式 template T compare :max()return (xy)?x:y; 4.类模板的类型参数可以是一个,也可以是多个,每个类型前都必须加class 5.类模板可以有层次,即一个模板可以作为基类,派生出模板类。,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报