类重用的方式之一组合课件_第1页
类重用的方式之一组合课件_第2页
类重用的方式之一组合课件_第3页
类重用的方式之一组合课件_第4页
类重用的方式之一组合课件_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

类重用的方式之一——组合部件组装的思想背景组合类与成员对象间的“has-a”关系组合类对象的构造与析构类重用的方式之一——组合部件组装的思想背景1inputoutputCPUMemoryis_a和has_a的区别。(属于和包含)inputoutputCPUMemoryis_a和h2组合类的概念类中的成员数据是另一个类的对象。描述的是一种包含与被包含的关系。组合类的概念类中的成员数据是另一个类的对象。3classPoint{private:floatx,y;//点的坐标public:Point(floath,floatv);//构造函数Point(Point&p);//拷贝构造函数floatGetX();//取X坐标floatGetY();//取Y坐标};//...函数的实现略classLine{private:Pointp1,p2;//线段的两个端点doublelen;public:Line(Pointa,Pointb);//构造函数Line(Line&l);

doubleGetLen()//求线段的长度};//...函数的实现略举例内嵌对象classPointclassLine举例内嵌对象4组合类的构造函数设计原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。定义形式类名::类名(形参表):内嵌对象1(参数),内嵌对象2(参数),......{本类初始化}组合类的构造函数设计原则:不仅要负责对本类中的基本类型成员数5//组合类的构造函数Line::Line(Pointxp1,Pointxp2):p1(xp1),p2(xp2){ cout<<"Line构造函数被调用"<<endl; doublex=double(p1.GetX()-p2.GetX()); doubley=double(p1.GetY()-p2.GetY()); len=sqrt(x*x+y*y);}//组合类的构造函数6组合类的构造函数调用构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(注:析构函数的调用顺序相反)若调用默认构造函数(即无形参的),则内嵌对象的初始化也将调用相应的默认构造函数。组合类的构造函数调用构造函数调用顺序:7组合类的拷贝构造函数如果没有编写拷贝构造函数,编译系统生成一个默认的拷贝构造函数。在调用组合类的默认的拷贝构造函数时,编译系统自动调用内嵌对象的拷贝构造函数。编写组合类的拷贝构造函数,需要为内嵌对象的拷贝构造函数传递参数。例如:C::C(C&c1):b(c1.b){…}组合类的拷贝构造函数如果没有编写拷贝构造函数,编译系统生成一8//组合类的拷贝构造函数Line::Line(Line&l):p1(l.p1),p2(l.p2){ cout<<"Line拷贝构造函数被调用"<<endl; len=l.len;}//组合类的拷贝构造函数9classPoint

{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<<"Point拷贝构造函数被调用"<<endl;}classLine

{public: Line(Pointxp1,Pointxp2);Line(Line&l);doubleGetLen(){returnlen;}private: Pointp1,p2; doublelen; };Line::Line(Pointxp1,Pointxp2):p1(xp1),p2(xp2){cout<<"Line构造函数被调用"<<endl;doublex=double(p1.GetX()-p2.GetX());doubley=double(p1.GetY()-p2.GetY());len=sqrt(x*x+y*y);}Line::Line(Line&l):p1(l.p1),p2(l.p2){cout<<"Line拷贝构造函数被调用"<<endl;len=l.len;}voidmain(){ Pointmyp1(1,1),myp2(4,5); Lineline(myp1,myp2); Lineline2(line);

cout<<"Thelengthofthelineis:"; cout<<line.GetLen()<<endl; cout<<"Thelengthoftheline2is:"; cout<<line2.GetLen()<<endl;}运行结果:Point拷贝构造函数被调用Point拷贝构造函数被调用Point拷贝构造函数被调用Point拷贝构造函数被调用Line构造函数被调用Point拷贝构造函数被调用Point拷贝构造函数被调用Line拷贝构造函数被调用Thelengthofthelineis:5Thelengthoftheline2is:5classPoint classLine voidm10思考:

设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,能计算矩形的面积。思考:设计并测试一个名为Rectangle的矩形类,其11classA

{public:voidf(Bb);//以B类对象为形参的成员函数};classB{public:voidg(Aa);//以A类对象为形参的成员函数};错误!两个类互相引用,形成循环依赖。classA错误!两个类互相引用,形成循环依赖。12前向引用声明类应该先声明,后使用。如果需要在某个类的声明之前,引用该类,则应进行前向引用声明。前向引用声明只为程序引入一个标识符,但具体声明在其它地方。前向引用声明类应该先声明,后使用。13classB;

//前向引用声明classA

{public:voidf(Bb);//以B类对象为形参的成员函数};classB{public:voidg(Aa);//以A类对象为形参的成员函数};classB;//前向引用声明14前向引用声明注意事项尽管使用了前向引用声明,但是在提供一个完整的类定义之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。classFred; //前向引用声明classBarney{Fredx; //错误:类Fred的定义尚不完善};classFred{Barneyy;};前向引用声明注意事项尽管使用了前向引用声明,但是在提供一个完15前向引用声明注意事项classFred; //前向引用声明classBarney{public:voidmethod(){x->f(); }private:F

温馨提示

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

评论

0/150

提交评论