收藏 分享(赏)

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

上传人:dzzj200808 文档编号:5753828 上传时间:2019-03-16 格式:PPT 页数:36 大小:433.50KB
下载 相关 举报
第三章 关于类和对象的进一步讨论.ppt_第1页
第1页 / 共36页
第三章 关于类和对象的进一步讨论.ppt_第2页
第2页 / 共36页
第三章 关于类和对象的进一步讨论.ppt_第3页
第3页 / 共36页
第三章 关于类和对象的进一步讨论.ppt_第4页
第4页 / 共36页
第三章 关于类和对象的进一步讨论.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

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营业执照举报