类组合成员初始化_第1页
类组合成员初始化_第2页
类组合成员初始化_第3页
类组合成员初始化_第4页
类组合成员初始化_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类组合成员初始化第1页/共32页2C++中,提供了用一个对象值创建并初始化另一个对象的方法,完成该功能的是拷贝构造函数。例如:

Tdated1(2002,3,1);Tdated2(d1);

用构造函数创建d1的值初始化新创建的对象d2。拷贝构造函数的特点:1、拷贝构造函数名字与类同名,没有返回类型;2、拷贝构造函数只有一个形参数,该参数是该类的对象的引用;拷贝构造函数(CopyConstructor)拷贝构造函数第2页/共32页33、拷贝构造函数的格式如下:

<类名>::<拷贝构造函数名>(<类名>&<引用名>){<函数体>}

其中,<拷贝构造函数名>与该类名相同;例如:下面程序说明了调用拷贝构造函数的过程#include<iostream.h>classTpoint{public:Tpoint(intxp,intyp){x=xp;y=yp;}Tpoint(Tpoint&p);//拷贝构造函数拷贝构造函数第3页/共32页4intxcoord(){returnx;}intycoord(){returny;}private:intx,y;};Tpoint::Tpoint(Tpoint&p){x=p.x;y=p.y;cout<<“Copy_initializationconstructorcalled.\n”;}拷贝构造函数第4页/共32页5voidmain(){Tpointp1(5,7);Tpointp2(p1);cout<<“p2=”<<p2.xcoord()<<“,”<<p2.ycoord()<<endl;}结果:Copy_initializationconstructorcalled.P2=5,7拷贝构造函数第5页/共32页6注意:如果一个类中没有定义拷贝构造函数,则系统自动生成一个缺省拷贝构造函数,其功能是将已知对象的所有数据成员的值拷贝给对应对象的数据成员。classA{floatx,y;public:A(floata,floatb){x=a;y=b;cout<<"调用了构造函数\n";}voidPrint(){cout<<x<<'\t'<<y<<endl;}};拷贝构造函数第6页/共32页7调用了构造函数1.0 2.01.0 2.01.0 2.0voidmain(void){Aa1(1.0,2.0);Aa2(a1);Aa3=a1;//可以这样赋值

a1.Print();a2.Print(); a3.Print();}拷贝构造函数第7页/共32页8拷贝构造函数举例classPoint{public:Point(intxx=0,intyy=0){X=xx;Y=yy;}Point(Point&p);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};Point::Point(Point&p){X=p.X;Y=p.Y;cout<<"拷贝构造函数被调用"<<endl;}拷贝构造函数第8页/共32页9拷贝构造函数调用(1)当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。voidmain(void){PointA(1,2);PointB(A);//拷贝构造函数被调用

cout<<B.GetX()<<endl;}拷贝构造函数第9页/共32页10(2)若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:voidfun1(Pointp){cout<<p.GetX()<<endl;}voidmain(){PointA(1,2);fun1(A);//调用拷贝构造函数}拷贝构造函数第10页/共32页11(3)当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:Pointfun2(){PointA(1,2);returnA;//调用拷贝构造函数}voidmain(){PointB;B=fun2();}拷贝构造函数第11页/共32页12注意:如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。拷贝构造函数第12页/共32页13构造函数和析构函数举例#include<iostream>usingnamespacestd;classPoint{public:Point(intxx,intyy);~Point();//...其它函数原形

private:intX,intY;};Point::Point(intxx,intyy){X=xx;Y=yy;}Point::~Point(){}//...其它函数的实现略构造函数和析构函数第13页/共32页14构造函数和析构函数调用举例#include<iostream.h>usingnamespacestd;classQ{intx,y;public:Q(inta=0,intb=0){cout<<“调用了构造函数”<<endl;x=a;y=b;}voidP(void){cout<<x<<‘\t’<<y<<‘\n’;}~Q(){cout<<“调用了析构函数!”<<‘\n’;}voidmain(void){Qq(50,100);q.P();cout<<“退出主数!”\n”;}输出:调用了构造函数50100退出主函数!调用了析构函数!构造函数和析构函数第14页/共32页15类的应用举例一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。游泳池过道构造函数和析构函数第15页/共32页16#include<iostream>usingnamespacestd;constfloatPI=3.14159;constfloatFencePrice=35;constfloatConcretePrice=20;classCircle//声明类Circle及其数据和方法{private:floatradius;public:Circle(floatr);//构造函数

floatCircumference();//圆周长

floatArea();//圆面积};Circle::Circle(floatr)//构造函数初始化数据成员radius{radius=r;}floatCircle::Circumference()//计算圆的周长{return2*PI*radius;}floatCircle::Area()//计算圆的面积{returnPI*radius*radius;}构造函数和析构函数第16页/共32页17voidmain(){floatradius;floatFenceCost,ConcreteCost;cout<<"Entertheradiusofthepool:";//提示用户输入半径

cin>>radius;CirclePool(radius);//声明Circle对象

CirclePoolRim(radius+3);FenceCost=PoolRim.Circumference()*FencePrice;//计算栅栏造价并输出

cout<<"FencingCostis¥"<<FenceCost<<endl;ConcreteCost=(PoolRim.Area()-Pool.Area())*ConcretePrice;//计算过道造价并输出

cout<<"ConcreteCostis¥"<<ConcreteCost<<endl;}运行结果Entertheradiusofthepool:10FencingCostis¥2858.85ConcreteCostis¥4335.3构造函数和析构函数第17页/共32页18#include“tpoint.h”Tpointfun(Tpointq);voidmain(){TpointM(12,20),P(0,0),S(0,0);TpointN(M);P=fun(N);S=M;cout<<“P=”<<P.xcoord()<<“,”<<P.ycoord()<<endl;cout<<“S=”<<S.xcoord()<<“,”<<S.ycoord()<<endl;}Tpointfun(Tpointq){cout<<“OK\n”;intx=q.xcoord()+10;inty=q.ycoord()+15;第18页/共32页19TpointR(x,y);returnR;}//…tpoint.h#include<iostream.h>classTpoint{public:Tpoint(intxp,intyp){x=xp;y=yp;}Tpoint(Tpoint&p);~Tpoint(){cout<<“Destructorcalled.\n”;}intxcoord(){returnx;}intycoord(){returny;}private:intx,y;};第19页/共32页20Tpoint::Tpoint(Tpoint&p){x=p.x;y=p.y;cout<<“Copy_initializationconstructorcalled.\n”;}输出结果如下:Copy_initializationconstructorcalled.Copy_initializationconstructorcalled.OKCopy_initializationconstructorcalled.Destructorcalled.Destructorcalled.Destructorcalled.第20页/共32页21

P=22,35S=12,20Destructorcalled.Destructorcalled.Destructorcalled.Destructorcalled.程序输出结果说明程序中出现了三次调用构造函数:TpointN(M);//M对象创建N对象P=fun(N);//实参N对象被拷贝到形参q对象returnR;//函数返回时,调用拷贝构造函数,用对象R创建

//一个临时对象,保存R的数据,在主函数中临

//时对象被释放前,将它的内容赋值到对象P中。临时对象P放入取出Rfun()主函数暂存区main()区临时对象起暂存作用的情况如下图所示:第21页/共32页22组合的概念类中的成员数据是另一个类的对象。可以在已有的抽象的基础上实现更复杂的抽象。

通过对复杂对象进行分解、抽象,使我们能够将一个复杂对象理解为简单对象的组合;分解得到复杂对象的部件对象,这些部件对象比它高层的复杂对象更容易理解和实现,然后由这些部件对象了“装配”复杂对象类

合第22页/共32页23例如:#include<iostream.h>classStudent{public:Student(){cout<<“Constructingstudent.\n”;semeshours=100;gpa=3.5;}第23页/共32页24

~Student(){cout<<“Destructingstudent.\n”;}protected:intsemeshours;floatgpa;};classTeacher{public:Teacher(){cout<<“Constructingteacher.\n”;}第24页/共32页25

~Teacher()

{cout<<“Destructingteacher.\n”;

}};classTutorpair{public:Tutorpair()

{cout<<“Constructingtutorpair.\n”;nomeetings=0;

}

~Tutorpair()

{cout<<“Destructingtutorpair.\n”;

}第25页/共32页26

protected:Studentstudent;Teacherteacher;intnomeetings;};voidmain(){Tutorpairtp;cout<<“Backinmain.\n”;}Constructingstudent.Constructingteacher.Constructingtutorpair.Backinmain.Destructing

tutorpair.Destructingteacher.Destructingstudent.运行结果:第26页/共32页27举例classPoint{private:floatx,y;//点的坐标

public:Point(floath,floatv);//构造函数

floatGetX(void);//取X坐标

floatGetY(void);//取Y坐标

voidDraw(void);//在(x,y)处画点};//...函数的实现略classLine{private://线段的两个端点

Pointp1,p2;public://构造函数

Line(Pointa,Pointb);//画出线段

VoidDraw(void);};//...函数的实现略类

合第27页/共32页28类组合的构造函数设计原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。声明形式:类名::类名(对象成员所需的形参,本类成员形参)

:对象1(参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论