W10 -构造函数.ppt
《W10 -构造函数.ppt》由会员分享,可在线阅读,更多相关《W10 -构造函数.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、10.1 构造函数构造函数10.2 析构函数析构函数10.3 拷贝构造函数拷贝构造函数10.4 拷贝函数与对象成员拷贝函数与对象成员第第10章章 构造函数和析构函数构造函数和析构函数 class Crect int left,top;public:int right,bottom;void setcoord(int,int,int,int);.;上一章的例题中曾提到对象的成员的初始化问题上一章的例题中曾提到对象的成员的初始化问题现在再回顾一下现在再回顾一下 在类在类Crect中共有中共有4个数据成员,其中个数据成员,其中 left,top 是私有成员是私有成员 right,bottom 是公有
2、成员是公有成员 公有成员可以直接用对象对它们初始化,私有成员的初始化公有成员可以直接用对象对它们初始化,私有成员的初始化则必须调用公有成员函数,并在函数体中通过访问私有成员来完成则必须调用公有成员函数,并在函数体中通过访问私有成员来完成 第第10章章 构造函数和析构函数构造函数和析构函数void Crect:setcoord(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;class Crect int left,top;public:int right,bottom;void setcoord(int,int,int,int);.;
3、void main(void)Crect r,rr;r.setcoord(100,300,50,200);这是调用成员函数,这是调用成员函数,可使公有和私有数据成员都被初始化可使公有和私有数据成员都被初始化 结果使得:结果使得:left=100 right=300 top=50 bottom=200第第10章章 构造函数和析构函数构造函数和析构函数例如例如第第10章章 构造函数和析构函数构造函数和析构函数 C+数数据据成成员员的的初初始始化化方方法法,除除上上述述方方法法之之外外,还还可可以以采采用用我我们们已已知知的的结结构构体体变变量量的的初初始始化化方方法法称称为为列列表表法法(见见例题
4、例题10.1,P218)。C c1=25,”张三张三”,77.8,99.56;列表法仅可对公有数据成员初始化列表法仅可对公有数据成员初始化.此外,此外,C+还提供了专门用作初始化的成员函数还提供了专门用作初始化的成员函数构造函数构造函数。而当某个对象的寿命到期时,它还提供了而当某个对象的寿命到期时,它还提供了一个用于释放对象所占资源的函数一个用于释放对象所占资源的函数析构函数析构函数。本章将分别介绍这两个函数。本章将分别介绍这两个函数。第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;pu
5、blic:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;.;现在把上例中现在把上例中4个数据成员都改成私有成员个数据成员都改成私有成员构造函数是类中的一个特殊的成员函数构造函数是类中的一个特殊的成员函数第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;.;它的特殊性表现为它的特殊性表现
6、为:构造函数没有自己的函数名构造函数没有自己的函数名而是直接用类名而是直接用类名当作函数名当作函数名与其它函数不同,与其它函数不同,不能为构造函数指定返回值类型和不能为构造函数指定返回值类型和void类型类型第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;.;Crect()left=0;right=0;top=0;bottom=0;;一个类可以定义一个或多
7、个构造函数,多个构造函数一个类可以定义一个或多个构造函数,多个构造函数满足函数重载原则。满足函数重载原则。下面看对象如何调用构造函数下面看对象如何调用构造函数/不带参数的构造函数不带参数的构造函数第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;.;Crect()left=0;right=0;top=0;bottom=0;;void main(void)Cr
8、ect r,rr(10,20,30,40);定义对象定义对象r,并调用无参构造函数并调用无参构造函数 结果使得:结果使得:left=0 right=0 top=0 bottom=0第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;.;Crect()left=0;right=0;top=0;bottom=0;;void main(void)Crect r,rr
9、(10,20,30,40);定义对象定义对象rr,并调用带参构造函数并调用带参构造函数 结果使得:结果使得:left=10 right=20 top=30 bottom=40第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;.;Crect()left=0;right=0;top=0;bottom=0;;void main(void)Crect r,rr(10
10、,20,30,40);,rrr();rrr不是对象,这种格式是不是对象,这种格式是说明一个函数原型。说明一个函数原型。这个函数的返回值是这个函数的返回值是Crect类型的对象类型的对象下面在成员函数中补充一个输出函数下面在成员函数中补充一个输出函数请注意,这种形式不是调用请注意,这种形式不是调用无参构造函数无参构造函数第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bott
11、om=B;Crect()left=0;right=0;top=0;bottom=0;;void Show()cout“left=“left“light=“light“n”;cout“top=“top“bottom=“bottom“n”;;void main(void)Crect r,rr(10,20,30,40);r.Show();对象对象r调用成员函数调用成员函数Show(),由于,由于r是通过调是通过调用无参构造函数初始化的,因此,输出结果是用无参构造函数初始化的,因此,输出结果是left=0 right=0 top=0 bottom=0第第10章章 构造函数和析构函数构造函数和析构函数
12、10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;Crect()left=0;right=0;top=0;bottom=0;;void Show()cout“left=“left“light=“light“n”;cout“top=“top“bottom=“bottom“n”;;void main(void)Crect r,rr(10,20,30,40);r.Show();对象对象rr调用成员函数调用成员函数S
13、how(),其结果是,其结果是left=0 right=0 top=0 bottom=0rr.Show();left=10 right=20 top=30 bottom=40第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;Crect()left=0;right=0;top=0;bottom=0;;void Show()cout“left=“left“lig
14、ht=“light“n”;cout“top=“top“bottom=“bottom“n”;;void main(void)Crect r,rr(10,20,30,40);r.Show();注意:注意:只要在类中定义了构造函数只要在类中定义了构造函数,构造函数是由系,构造函数是由系统自动调用的。如果没有定义无参构造函数,统自动调用的。如果没有定义无参构造函数,rr.Show();这里将引起错误,因为这里将引起错误,因为r没有对应的无参构造函数可供调用没有对应的无参构造函数可供调用第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int lef
15、t,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;Crect()left=0;right=0;top=0;bottom=0;;void Show()cout“left=“left“light=“light“n”;cout“top=“top“bottom=“bottom“n”;;void main(void)Crect r,rr(10,20,30,40);不带参数的构造函数也是参数为缺省值的构造函数不带参数的构造函数也是参数为缺省值的构造函数此前,我们介绍过参数为缺省值的函数
16、,此前,我们介绍过参数为缺省值的函数,这种函数同样可用于构造函数,例如这种函数同样可用于构造函数,例如 Crect(int L=0,int R=0,int T=0,int B=0)left=L;right=R;top=T;bottom=B;曾记否?所谓参数为缺省值的函数曾记否?所谓参数为缺省值的函数就是给形参赋了初值的函数就是给形参赋了初值的函数第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;righ
17、t=R;top=T;bottom=B;Crect()left=0;right=0;top=0;bottom=0;;void Shouw()cout“left=“left“light=“light“n”;cout“top=“top“bottom=“bottom“n”;;void main(void)Crect r,rr(10,20,30,40);但是,本例中将发生错误!但是,本例中将发生错误!Crect(int L=0,int R=0,int T=0,int B=0)left=L;right=R;top=T;bottom=B;因此,对象因此,对象r不知道调用哪一个不知道调用哪一个这就是说,在一个
18、类中这就是说,在一个类中缺省构造函数只能有一个缺省构造函数只能有一个因为无参或者参数为缺省值的构造函因为无参或者参数为缺省值的构造函数数都都被认为是被认为是缺省构造函数缺省构造函数,它们的,它们的性质相同。性质相同。第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;Crect()left=0;right=0;top=0;bottom=0;;void Shou
19、w()cout“left=“left“light=“light“n”;cout“top=“top“bottom=“bottom“n”;;void main(void)Crect r,rr(10,20,30,40);Crect(int L=0,int R=0,int T=0,int B=0)left=L;right=R;top=T;bottom=B;产生对象时,系统必定调用构造函数。产生对象时,系统必定调用构造函数。如果类中如果类中没有定义没有定义构造函数时,编译器自动产生一构造函数时,编译器自动产生一个缺省的构造函数:个缺省的构造函数:第第10章章 构造函数和析构函数构造函数和析构函数 10.
20、1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;Crect()left=0;right=0;top=0;bottom=0;;void Shouw()cout“left=“left“light=“light“n”;cout“top=“top“bottom=“bottom“n”;;void main(void)Crect r,rr(10,20,30,40);Crect(int L=0,int R=0,int T=0,
21、int B=0)left=L;right=R;top=T;bottom=B;Creat()此缺省构造函数的函数体为空,此缺省构造函数的函数体为空,产生对象时,尽管调用了该构产生对象时,尽管调用了该构造函数,但对象的数据成员的造函数,但对象的数据成员的值是不确定的。值是不确定的。编译器自动产生一个缺省的构造函数。编译器自动产生一个缺省的构造函数。第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class Crect int left,top,right,bottom;public:Crect(int L,int R,int T,int B)left=L;right
22、=R;top=T;bottom=B;Crect()left=0;right=0;top=0;bottom=0;;void Shouw()cout“left=“left“light=“light“n”;cout“top=“top“bottom=“bottom“n”;;Crect:Crect(int L,int R,int T,int B)left=L;right=R;top=T;bottom=B;当然,构造函数也可以只说明原型,当然,构造函数也可以只说明原型,而在类外定义函数体。例如而在类外定义函数体。例如 Crect(int L=0,int R=0,int T=0,int B=0)left=L
23、;right=R;top=T;bottom=B;.;延伸到类体之外的定义都需要延伸到类体之外的定义都需要插入:类名插入:类名+作用域运算符作用域运算符”:”第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class A int x,y;public:A(int a,int b)x=a;y=b;cout“调用带参构造函数调用带参构造函数”t;A()cout“调用缺省构造函数调用缺省构造函数”t;void Show()cout“x=”xt“y=”yShow();delete p1;下面再看用下面再看用 new 运算符动态建立对象运算符动态建立对象并调用构造函数的过程
24、并调用构造函数的过程带参和缺省构造函数带参和缺省构造函数定义类定义类A类型的指针,并用类型的指针,并用new动态分配动态分配一个对象,同时调用带参构造函数一个对象,同时调用带参构造函数第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class A int x,y;public:A(int a,int b)x=a;y=b;cout“调用带参构造函数调用带参构造函数”t;A()cout“调用缺省构造函数调用缺省构造函数”t;void Show()cout“x=”xt“y=”yShow();delete p1;定义类定义类A类型的指针,并用类型的指针,并用new动态分
25、配动态分配一个对象,同时调用带参构造函数一个对象,同时调用带参构造函数这使得私有成员分别得到这使得私有成员分别得到x=5 y=10同时执行输出同时执行输出调用带参构造函数调用带参构造函数第第10章章 构造函数和析构函数构造函数和析构函数 10.1 构造函数构造函数 class A int x,y;public:A(int a,int b)x=a;y=b;cout“调用带参构造函数调用带参构造函数”t;A()cout“调用缺省构造函数调用缺省构造函数”t;void Show()cout“x=”xt“y=”yShow();delete p1;动态对象调用函数动态对象调用函数输出私有成员的数据输出私
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- W10 -构造函数 构造 函数
限制150内