c-中构造函数和析构函数讲解课件.ppt

上传人(卖家):三亚风情 文档编号:3376646 上传时间:2022-08-25 格式:PPT 页数:33 大小:274.01KB
下载 相关 举报
c-中构造函数和析构函数讲解课件.ppt_第1页
第1页 / 共33页
c-中构造函数和析构函数讲解课件.ppt_第2页
第2页 / 共33页
c-中构造函数和析构函数讲解课件.ppt_第3页
第3页 / 共33页
c-中构造函数和析构函数讲解课件.ppt_第4页
第4页 / 共33页
c-中构造函数和析构函数讲解课件.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、10.1 构造函数构造函数10.2 析构函数析构函数10.3 实现类型转换和实现类型转换和 拷贝的构造函数拷贝的构造函数10.4 构造函数和对象成员构造函数和对象成员第第10章章 构造函数和析构函数构造函数和析构函数给对象的数据成员赋值有二类(四种)方法:给对象的数据成员赋值有二类(四种)方法:1.定义时赋值(初始化)定义时赋值(初始化)(1)用数据列表初始化(数据成员为公有访问权限);)用数据列表初始化(数据成员为公有访问权限);(2)用)用构造函数构造函数初始化。初始化。2.定义后赋值定义后赋值(1)用成员函数赋值)用成员函数赋值-回顾第回顾第9章章示例示例3;(2)用同类型的对象赋值。)

2、用同类型的对象赋值。如:如:class A public:int a,b;void set(int x,int y)a=x;b=y;void main()A a1=5,10,a2,a3;a2.set(15,20);a3=a1;10.1 构造函数构造函数1.构造函数是实现数据成员初始化的特殊的构造函数是实现数据成员初始化的特殊的成员函数成员函数;2.构造函数构造函数与类同名与类同名,没有类型没有类型,也,也不返回值不返回值;3.创建对象时,构造函数创建对象时,构造函数被自动调用被自动调用。每创建一个对象每创建一个对象都必须调用一次构造函数都必须调用一次构造函数,每调用一次构造函数必定创,每调用一

3、次构造函数必定创建一个对象。建一个对象。1.普通构造函数:普通参数;普通构造函数:普通参数;2.拷贝构造函数:参数为对象的引用。拷贝构造函数:参数为对象的引用。一个类至少有上述两个构造函数,可以有更多的构造一个类至少有上述两个构造函数,可以有更多的构造函数(构造函数允许函数(构造函数允许重载重载),以实现不同形式对象的创),以实现不同形式对象的创建。建。10.1 构造函数构造函数1.类中定义格式类中定义格式 类名类名(形参列表)(形参列表)./函数体,对数据成员赋值函数体,对数据成员赋值2.类中说明,类外定义类中说明,类外定义(1)类中说明类中说明 类名类名(形参列表);(形参列表);(2)类

4、外定义)类外定义 类名类名:类名类名(形参列表)(形参列表)./函数体函数体10.1 构造函数构造函数例例10-1 定义表示平面点的类定义表示平面点的类Point及其构造函数。及其构造函数。class Pointfloat x,y;public:Point(float a,float b);Point(float a)x=y=a;void print()cout(x,y“)n”;Point:Point(float a,float b)x=a;y=b;10.1 构造函数构造函数建立对象时,必须提供与构造函数建立对象时,必须提供与构造函数形参一致形参一致的的实参实参,其,其基本格式只有如下两种形式

5、:基本格式只有如下两种形式:类名类名 对象名(实参)对象名(实参);类名类名 对象名;对象名;例例10-2 用例用例10-1定义的类定义对象,并初始化。定义的类定义对象,并初始化。class Point float x,y;public:Point(float a,float b);Point(float a)x=y=a;void print()cout(x,y“)n”;Point:Point(float a,float b)x=a;y=b;void main()Point p1(5),p2(10,15);p1.print();p2.print();10.1 构造函数构造函数主函数中,能否添加

6、下列语句:主函数中,能否添加下列语句:Point p3;1.缺省构造函数的种类缺省构造函数的种类(1)系统)系统自动产生自动产生的构造函数,如下所示:的构造函数,如下所示:类名()类名()(2)用户定义的)用户定义的没有参数没有参数的构造函数;的构造函数;(3)用户定义的)用户定义的所有参数都有缺省值所有参数都有缺省值的构造函数。的构造函数。2.用缺省构造函数创建对象的格式:用缺省构造函数创建对象的格式:类名类名 对象名对象名;3.使用时的注意使用时的注意(1)只有在用户没有定义构造函数时,系统才自动产)只有在用户没有定义构造函数时,系统才自动产生构造函数;生构造函数;(2)类中可能没有缺省的

7、构造函数;)类中可能没有缺省的构造函数;(3)一个类最多只能有一个缺省的构造函数。)一个类最多只能有一个缺省的构造函数。10.1 构造函数构造函数例例10-3 缺省构造函数的使用。缺省构造函数的使用。class Pointfloat x,y;public:Point()x=0;y=0;Point(float a ,float b )x=a;y=b;/Avoid print()cout(x,y“)n”;void main()Point p1,p2(1,2);p1.print();p2.print();10.1 构造函数构造函数主函数能否增加:主函数能否增加:Point p3();p3.print

8、();能否对能否对A行作如下修改?行作如下修改?=0 =01.用用new运行符产生动态对象运行符产生动态对象(1)产生单个对象(可以初始化);)产生单个对象(可以初始化);(2)产生数组对象(不能初始化)。)产生数组对象(不能初始化)。如:如:class C float r,i;public:C(float r1,float i1)r=r1;i=i1;cout“构造构造n”;C()r=i=0;cout“缺省构造缺省构造n”;void main()C*p1=new C,*p2=new C(2,-3),*p3=new C5;10.1 构造函数构造函数2.用用new为指针成员分配动态空间为指针成员分

9、配动态空间 当类的数据成员为指针时,在构造函数中应:当类的数据成员为指针时,在构造函数中应:先先用用new运算符为指针动态运算符为指针动态分配空间分配空间;然后然后再对再对指针所指指针所指空间空间赋值。赋值。如:如:class Array int*p;.;/p表示表示10个元素的一维数组个元素的一维数组则如下的构造函数都是错误的:则如下的构造函数都是错误的:Array(int*t)p=t;Array(int*t)*p=*t;Array(int*t)for(int i=0;i10;i+)pi=ti;Array(int*t)p=new int10;p=t;/*p=*t;正确的应为:正确的应为:Ar

10、ray(int*t)p=new int10;/分配动态空间分配动态空间 for(int i=0;i10;i+)pi=ti;/对动态空间赋值对动态空间赋值 10.1 构造函数构造函数1.析构函数的概念析构函数的概念用于撤消对象的成员函数。用于撤消对象的成员函数。2.定义格式定义格式(1)类中定义)类中定义 类名()类名()./函数体函数体(2)类中说明,类外定义)类中说明,类外定义 类中说明类中说明 类名();类名();/类中说明类中说明 类外定义类外定义 类名类名:类名()类名()/类外定义类外定义 ./函数体函数体10.2 析构函数析构函数3.使用时注意:使用时注意:(1)析构函数的名称由运

11、算符)析构函数的名称由运算符与类名组成;与类名组成;(2)析构函数无函数类型,无参数,且不返回值;)析构函数无函数类型,无参数,且不返回值;(3)析构函数不可以重载,每个类只有一个析构函数;)析构函数不可以重载,每个类只有一个析构函数;(4)类中通常不需要定义析构函数,而由系统自动产生)类中通常不需要定义析构函数,而由系统自动产生一个如下的缺省析构函数:一个如下的缺省析构函数:类名类名:类名()类名()(5)当类中用)当类中用new 运算符分配了动态空间时,必须定义运算符分配了动态空间时,必须定义析构函数,并在函数体中用析构函数,并在函数体中用delete运算符释放动态空间。运算符释放动态空间

12、。4.构造函数与析构函数的调用过程构造函数与析构函数的调用过程在创建对象时,调用构造函数;在撤消对象时,调用析在创建对象时,调用构造函数;在撤消对象时,调用析构函数;所以它们的调用过程(顺序)通常是相反的。构函数;所以它们的调用过程(顺序)通常是相反的。10.2 析构函数析构函数 当一个对象被赋值为一个数字,如果这个数字可以放入某个构当一个对象被赋值为一个数字,如果这个数字可以放入某个构造函数实现对这个构造函数的调用时,则该赋值语句成立造函数实现对这个构造函数的调用时,则该赋值语句成立。其实质。其实质是以所给的数据为参数调用普通的构造函数初始化对象,此时的构是以所给的数据为参数调用普通的构造函

13、数初始化对象,此时的构造函数称为类型转换的构造函数。造函数称为类型转换的构造函数。例例10-4 用类型转换的构造函数初始化对象。用类型转换的构造函数初始化对象。class Ex int x,y;public:Ex(int a,int b=10)x=a;y=b;cout“x=”x“,y=”y“n”;Ex()coutx“,释放对象。释放对象。n”;void main()Ex e1(5);Ex e2=15;e1=20;cout“End.n”;10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数其中:其中:Ex e2=15;等同于等同于Ex e2(15);e1=20;等同于等同于e1=E

14、x(20);x=5,y=10 x=15,y=10 x=20,y=1020,释放对象。释放对象。End.15,释放对象。释放对象。20,释放对象。释放对象。拷贝功能的构造函数实现:用一个已建立的对象初始化同类型的拷贝功能的构造函数实现:用一个已建立的对象初始化同类型的对象,其调用格式为:对象,其调用格式为:类名类名 新对象名(已建立对象名)新对象名(已建立对象名);或或类名类名 新对象名新对象名=已建立对象名已建立对象名;例例10-5 用拷贝构造函数初始化对象。用拷贝构造函数初始化对象。class Ex int x,y;public:Ex(int a,int b)x=a;y=b;cout“x=”

15、x“,y=”y“,普通构造。普通构造。n”;Ex(Ex&t)/拷贝功能的构造函数拷贝功能的构造函数 x=t.x;y=t.y;cout“x=”x“,y=”y“,拷贝构造。拷贝构造。n”;void main()Ex e1(5,10);Ex e2(e1);Ex e3=e2;10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数x=5,10,普通构造普通构造x=5,10,拷贝构造拷贝构造x=5,10,拷贝构造拷贝构造l与普通构造函数相似,若用户不定义拷贝功能构造函数,系与普通构造函数相似,若用户不定义拷贝功能构造函数,系统自动产生一个缺省的拷贝功能构造函数,它把已建立对象统自动产生一个缺省

16、的拷贝功能构造函数,它把已建立对象各数据成员的值依次赋给新对象。其定义如下:各数据成员的值依次赋给新对象。其定义如下:类名类名:类名类名(类名类名&对象名对象名)*this=对象名;对象名;l用户通常可以直接使用缺省的拷贝功能构造函数,但在以下用户通常可以直接使用缺省的拷贝功能构造函数,但在以下情况下必须重新定义:情况下必须重新定义:(1)新建对象与已建立对象的数据有差异;如)新建对象与已建立对象的数据有差异;如:Ex2 e2(e1);(2)数据成员中有指针,并使用了动态内存。)数据成员中有指针,并使用了动态内存。l类的构造函数有两类、多种形式,使用时应加以区分。类的构造函数有两类、多种形式,

17、使用时应加以区分。10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数例例10-6 用普通构造函数和拷贝构造函数创建对象。用普通构造函数和拷贝构造函数创建对象。class A public:A(int x=1)coutx“t”;A(A&t)cout“拷贝拷贝t”;void main()A a1,a2(2),a3=3;coutn;A a4=A(4),a5=a1,a6(a1);coutn;a1=5;a2=a1;a3=A(0);coutn;10.3 实现类型转换和拷贝的构造函数实现类型转换和拷贝的构造函数运行结果运行结果:1234 拷贝拷贝拷贝拷贝 拷贝拷贝50程序中共创建了几个对象?

18、程序中共创建了几个对象?1.对象成员的概念对象成员的概念 类的类的数据成员数据成员为其他已定义类的为其他已定义类的对象对象,该成员称为对象成员。,该成员称为对象成员。2.初始化对象成员的方法初始化对象成员的方法 在构造函数中以在构造函数中以对象名对象名调用调用对象所属类的对象所属类的构造函数构造函数完成,其基完成,其基本格式为:本格式为:类名类名:类名类名(形参表形参表):对象名对象名(实参表实参表)/初始化普通成员初始化普通成员 3.当前对象在初始化(构造函数调用)时的顺序当前对象在初始化(构造函数调用)时的顺序 (1)先完成)先完成对象对象成员成员的初始化,有多个对象成员时,先说明的的初始

19、化,有多个对象成员时,先说明的先初始化;先初始化;(2)再完成再完成普通普通成员成员的初始化。的初始化。即先调用对象成员所属类的构造函数,再执行自身类的函数体。即先调用对象成员所属类的构造函数,再执行自身类的函数体。4.对象的撤消(析构函数调用)顺序:与建立顺序相反。对象的撤消(析构函数调用)顺序:与建立顺序相反。10.4 构造函数和对象成员构造函数和对象成员例例10-7 含对象成员类的构造函数。含对象成员类的构造函数。class A int a;public:A(int x=0)a=x;cout“A()n”;A()couta“A()n”;class B int b;public:B(int

20、x=0)b=x;cout“B()n”;B()coutb“B()n”;class C int c;B b1;A a1;B b2;public:C(int x,int y,int z):a1(x),b1(y),b2(z)c=x+y+z;cout“C()n”;C()coutc“A()n”;void main()C c1(1,2,3);10.4 构造函数和对象成员构造函数和对象成员对象说明顺序对象说明顺序决定构造函数决定构造函数调用顺序调用顺序对象调用构造对象调用构造函数语句决定函数语句决定对象成员的值对象成员的值一、选择题一、选择题1、以下有关析构函数的叙述不正确的是、以下有关析构函数的叙述不正确的

21、是 。A、析构函数没有任何函数类型、析构函数没有任何函数类型B、析构函数的作用是在撤销对象时收回分配的内存空间、析构函数的作用是在撤销对象时收回分配的内存空间C、析构函数可以有形参、析构函数可以有形参D、一个类只有一个析构函数、一个类只有一个析构函数2、关于类的缺省构造函数,下列说法正确的是、关于类的缺省构造函数,下列说法正确的是 。A、类的缺省构造函数没有参数、类的缺省构造函数没有参数B、类的缺省构造函数是由系统自动产生的空函数、类的缺省构造函数是由系统自动产生的空函数C、每个类均可定义缺省的构造函数、每个类均可定义缺省的构造函数D、每个类均有且有一个缺省的构造函数、每个类均有且有一个缺省的

22、构造函数3、通常拷贝初始化构造函数的参数是通常拷贝初始化构造函数的参数是 。A、某个对象的名称、某个对象的名称 B、某个对象的成员名、某个对象的成员名C、指向某个对象的指针名、指向某个对象的指针名 D、某个对象的引用名、某个对象的引用名课堂练习课堂练习4、设有如下类的定义:、设有如下类的定义:class Ex int*p;public:Ex()delete p;Ex(int x=0)p=new int(x);则下列对象的定义中,不正确的是则下列对象的定义中,不正确的是 。A、Ex ex;B、Ex ex1(50),ex2=ex1;C、Ex ex=Ex(50);DEx ex=50;5、下列关于构造

23、函数说法不正确的是、下列关于构造函数说法不正确的是 。A、构造函数必须与类同名、构造函数必须与类同名B、构造函数可以省略不写、构造函数可以省略不写C、构造函数必须有返回值、构造函数必须有返回值D、在构造函数中可以对类中的成员进行初始化、在构造函数中可以对类中的成员进行初始化6、已定义类、已定义类A,该类构造函数的参数都没有缺省值,执行语句:,该类构造函数的参数都没有缺省值,执行语句:A a1(2),a2(1,2),*p=new A3;则自动调用该类的缺省构造函数的次数为则自动调用该类的缺省构造函数的次数为 。A、1 B、3 C、2 D、5课堂练习课堂练习7、下列程序中出现编译错误的是、下列程序

24、中出现编译错误的是 。#include class Aint a,b;public:A(int x,int y)a=x;b=y;void print()coutatbprint();/DA、A行行 B、B行行 C、C行行 D、D行行课堂练习课堂练习8、下列程序中不出现编译错误的是、下列程序中不出现编译错误的是 。class Aint a,b;A()a=10;b=20;public:A(int x)a=b=x;void main()A a1;/AA a2(1);/BA a3=1,2;/CA a4(1,2);/DA、A行行 B、B行行 C、C行行 D、D行行课堂练习课堂练习9、下面程序的运行结果为

25、、下面程序的运行结果为 。#includeclass Aint num;public:A(int i)num=i;A(A&a)num=a.num+;void print()coutnum;void main()A a(10),b(a);a.print();b.print();coutendl;A、1010 B、1011 C、1111 D、1110课堂练习课堂练习二、填空题二、填空题1、执行下列语句时,系统自动调用了构造函数、执行下列语句时,系统自动调用了构造函数 次:次:Myclass p13,*p23,p3,*p4=p1,*p5=new Myclass;2、当类、当类A的成员是类的成员是类B

26、的对象时,则把类的对象时,则把类B中的类中的类A的对象称的对象称为为 成员。成员。3、对象成员的初始化是通过、对象成员的初始化是通过 调用调用 完成的。完成的。4、缺省的一般构造函数,除了系统自动生产的外,还有用户、缺省的一般构造函数,除了系统自动生产的外,还有用户定义的定义的的构造函数或的构造函数或 的的构造函数三种形式,但一个类中最多有构造函数三种形式,但一个类中最多有 个缺省的一般个缺省的一般构造函数。构造函数。5、以同类型的已有对象初始化新建对象时,调用的构造函数、以同类型的已有对象初始化新建对象时,调用的构造函数是是 ,使用时有两种具体形式:,使用时有两种具体形式:(1);(;(2)

27、。课堂练习课堂练习6、下面程序下面程序段段的执行结果是的执行结果是 。#include class Point int x,y;public:Point()x=y=0;Point(int a,int b)x=a;y=b;Point(Point&P);void show()coutx=x,y=yn;Point:Point(Point&P)x=P.x+10;y=P.y+10;void main()Point p1,p2(3,5),p3=p2;p1.show();p2.show();p3.show();课堂练习课堂练习7、下面程序下面程序段段的执行结果是的执行结果是 。#include class

28、Aint a;public:A(int x=0)a=x;coutA()t;A()coutA()t;class Bint b;public:B(int x)b=x;coutB()t;B()coutB()t;class CB b1;A a1;public:C(int x,int y):a1(x),b1(y)coutC()t;C()coutC()t;void main()C c1(10,20);coutn;课堂练习课堂练习8、下列程序定义点类下列程序定义点类Point和线和线段段类类Line,并求线段的长度。完善程序。,并求线段的长度。完善程序。程程序的运行结果序的运行结果 点:点:(1,3)点:点

29、:(2,4)线段长度为:线段长度为:1.41421#include#include class Pointint x;public:int y;Point(int=0,int=0);int getx()return x;void print()cout“点:点:(”x,y“)t”;x=a;y=b;class LinePoint p1,p2;public:Line(int a,int b,int c,int d):p1(a,c),p2(b,d)void show()p1.print();p2.print();double distance()double x=,y=p1.y-p2.y;retur

30、n sqrt(x*x+y*y);void main()Line l(1,2,3,4);l.show();cout“线段长度为:线段长度为:”n;课堂练习课堂练习9、下列程序下列程序的运行结果是的运行结果是 。#include class Aint a,b;public:A(int x,int y)a=x;b=y;void show()coutatbn;void main()A a13=A(1,2),A(3,4),A(5,6);a10.show();a11.show();a12.show();课堂练习课堂练习三、程序设计题三、程序设计题练习练习1、定义一个类、定义一个类Array,求一个二维数组

31、各列元素的平均值,并,求一个二维数组各列元素的平均值,并将所求得的平均值按顺序存入一个一维数组中,具体要求如下:将所求得的平均值按顺序存入一个一维数组中,具体要求如下:(1)私有数据成员)私有数据成员 int a45;float b5;数组数组b依次存放数组依次存放数组a的各列元素的平均值的各列元素的平均值(2)公有成员函数)公有成员函数 Array(int t5,int n):用数组:用数组t初始化数组初始化数组a(n为数组为数组t的行数),的行数),并将数组并将数组b的元素全部初始化为的元素全部初始化为0。void average():计算数组:计算数组a的各列元素的平均值,并存放到数组的

32、各列元素的平均值,并存放到数组b中。中。void show():输出所有成员数据,二维数组必须按行列形式输出。:输出所有成员数据,二维数组必须按行列形式输出。(3)在主函数中定义一个二维数组,并进行初始化,用该数组对类)在主函数中定义一个二维数组,并进行初始化,用该数组对类Array进行测试。进行测试。课堂练习课堂练习练习练习2、定义集合类、定义集合类Set,求两个集合的交集。具体要求如下:,求两个集合的交集。具体要求如下:(1)私有数据成员)私有数据成员 int s110,n1,s210,n2;/原始集合和元素个数原始集合和元素个数 int n,*r;/交集元素的个数和交集交集元素的个数和交

33、集(2)公有成员函数)公有成员函数构造函数构造函数Set(int,int,int,int):用参数初始化原始集合;:用参数初始化原始集合;int fun(int,int,int):判断整数是否属于集合,是返回:判断整数是否属于集合,是返回1,不,不是返回是返回0;void intersection():求交集元素的个数和交集;:求交集元素的个数和交集;void show():按每行:按每行5个元素的方式输出原始集合和交集;个元素的方式输出原始集合和交集;析构函数:释放动态空间。析构函数:释放动态空间。(3)在主函数中用数据)在主函数中用数据3,4,6,7,8,12,15,16和和2,4,5,6

34、,12,14,16,18,20作为原始集合定义对象作为原始集合定义对象set,对定义的类,对定义的类进行测试。进行测试。课堂练习课堂练习练习练习3、定义一个字符串类、定义一个字符串类String,将字符串,将字符串b插入到字符串插入到字符串a的第的第n个字符处,字符串个字符处,字符串a的第的第n个字符及右边的字符向右个字符及右边的字符向右移动(假定移动(假定a中的字符串长度大于中的字符串长度大于n)。具体要求如下:)。具体要求如下:(1)私有数据成员)私有数据成员 char a100,b100;int n;(2)公有成员函数)公有成员函数String(char c,char d,int m):构造函数,以参数:构造函数,以参数初始化数据成员;初始化数据成员;void fun():功能函数,将:功能函数,将b插入插入a中第中第n个字符处;个字符处;void show():功能函数,输出数据成员。:功能函数,输出数据成员。(3)在主函数中对定义的类进行测试,把)在主函数中对定义的类进行测试,把“abc”插入到插入到“123456789”的第的第5个字符处。个字符处。课堂练习课堂练习 P.238:2.3.作业作业

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(c-中构造函数和析构函数讲解课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|