版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,C+ 中,提供了用一个对象值创建并初始化另一个对象的方法,完成该功能的是拷贝构造函数。例如: Tdate d1(2002,3,1); Tdate d2(d1); 用构造函数创建d1 的值初始化新创建的对象d2。 拷贝构造函数的特点: 1、拷贝构造函数名字与类同名,没有返回类型; 2、拷贝构造函数只有一个形参数,该参数是该类的对象的引用;,拷贝构造函数(Copy Constructor),拷贝构 造 函 数,2,3、拷贝构造函数的格式如下: :( /拷贝构造函数,拷贝构 造 函 数,3,int xcoord() return x; int ycoord() return y; private
2、: int x,y; ; Tpoint:Tpoint(Tpoint ,拷贝构 造 函 数,4,void main() Tpoint p1(5,7); Tpoint p2(p1); cout“p2=”p2.xcoord()“,”p2.ycoord()endl; ,结果: Copy_initialization constructor called. P2=5,7,拷贝构 造 函 数,5,注意: 如果一个类中没有定义拷贝构造函数,则系统自动生成一个缺省拷贝构造函数,其功能是将已知对象的所有数据成员的值拷贝给对应对象的数据成员。,class A float x, y; public: A(float
3、 a, float b) x=a; y=b; cout调用了构造函数n; void Print() coutxtyendl; ;,拷贝构 造 函 数,6,调用了构造函数 1.02.0 1.02.0 1.02.0,void main(void) A a1(1.0, 2.0); A a2(a1); A a3 = a1; /可以这样赋值 a1.Print(); a2.Print(); a3.Print();,拷贝构 造 函 数,7,拷贝构造函数举例,class Point public: Point(int xx=0,int yy=0)X=xx; Y=yy; Point(Point ,拷贝构 造 函
4、 数,8,拷贝构造函数调用,(1)当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。 void main(void) Point A(1,2); Point B(A); /拷贝构造函数被调用 coutB.GetX()endl; ,拷贝构 造 函 数,9,(2)若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如: void fun1(Point p) coutp.GetX()endl; void main() Point A(1,2); fun1(A); /调用拷贝构造函数 ,拷贝构 造 函 数,10,(3)当函数的返回值是类对象时,系
5、统自动调用拷贝构造函数。例如: Point fun2() Point A(1,2); return A; /调用拷贝构造函数 void main() Point B; B=fun2(); ,拷贝构 造 函 数,11,注意:,如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。 这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。,拷贝构 造 函 数,12,构造函数和析构函数举例,#include using namespace std; class Point public: Point(int xx,int yy); P
6、oint(); /.其它函数原形 private: int X,int Y; ; Point:Point(int xx,int yy) X=xx; Y=yy; Point:Point() /.其它函数的实现略,构 造 函 数 和 析 构 函 数,13,构造函数和析构函数调用举例,#include using namespace std; class Q int x,y; public: Q(int a=0,int b=0) cout“调用了构造函数”endl; x=a;y=b; void P(void) coutxtyn; Q() cout“调用了析构函数!”n;,void main(void
7、) Q q(50,100); q.P(); cout“退出主数!”n”; ,输出: 调用了构造函数 50 100 退出主函数! 调用了析构函数!,构 造 函 数 和 析 构 函 数,14,类的应用举例,一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。,构 造 函 数 和 析 构 函 数,15,#include using namespace std; const float PI = 3.14159; const float FencePrice =
8、35; const float ConcretePrice = 20; class Circle /声明类Circle 及其数据和方法 private: float radius; public: Circle(float r); /构造函数 float Circumference(); /圆周长 float Area() ; /圆面积 ; Circle:Circle(float r) /构造函数初始化数据成员radius radius=r; float Circle:Circumference() / 计算圆的周长 return 2 * PI * radius; float Circle:A
9、rea() /计算圆的面积 return PI * radius * radius; ,构 造 函 数 和 析 构 函 数,16,void main () float radius; float FenceCost, ConcreteCost; coutradius; Circle Pool(radius); /声明 Circle 对象 Circle PoolRim(radius + 3); FenceCost = PoolRim.Circumference() * FencePrice; /计算栅栏造价并输出 cout Fencing Cost is ¥ FenceCost endl; Co
10、ncreteCost = (PoolRim.Area() -Pool.Area()*ConcretePrice; /计算过道造价并输出 cout Concrete Cost is ¥ ConcreteCost endl; ,运行结果 Enter the radius of the pool: 10 Fencing Cost is ¥2858.85 Concrete Cost is ¥4335.3,构 造 函 数 和 析 构 函 数,17,#include “tpoint.h” Tpoint fun(Tpoint q); void main() Tpoint M(12,20),P(0,0),S(
11、0,0); Tpoint N(M); P=fun(N); S=M; cout“P=”P.xcoord()“,”P.ycoord() endl; cout“S=”S.xcoord()“,”S.ycoord() endl; Tpoint fun(Tpoint q) cout“OKn”; int x=q.xcoord()+10; int y=q.ycoord()+15;,18,Tpoint R(x,y); return R; /tpoint.h #include class Tpoint public: Tpoint(int xp,int yp) x=xp; y=yp; Tpoint(Tpoint,
12、19,Tpoint:Tpoint(Tpoint 输出结果如下: Copy_initialization constructor called. Copy_initialization constructor called. OK Copy_initialization constructor called. Destructor called. Destructor called. Destructor called.,20,P=22,35 S=12,20 Destructor called. Destructor called. Destructor called. Destructor c
13、alled. 程序输出结果说明程序中出现了三次调用构造函数: Tpoint N(M); /M 对象创建N 对象 P=fun(N); /实参N 对象被拷贝到形参q对象 return R; /函数返回时,调用拷贝构造函数,用对象R创建 / 一个临时对象,保存R 的数据,在主函数中临 / 时对象被释放前,将它的内容赋值到对象P 中。,临时对象起暂存作用的情况如下图所示:,21,组合的概念,类中的成员数据是另一个类的对象。 可以在已有的抽象的基础上实现更复杂的抽象。 通过对复杂对象进行分解、抽象,使我们能够将一个复杂对象理解为简单对象的组合;分解得到复杂对象的部件对象,这些部件对象比它高层的复杂对象更
14、容易理解和实现,然后由这些部件对象了“装配”复杂对象,类 的 组 合,22,例如: #include class Student public: Student() cout“Constructing student.n”; semeshours=100; gpa=3.5; ,23,Student() cout “Destructing student.n”; protected: int semeshours; float gpa; ; class Teacher public: Teacher() cout“Constructing teacher.n”; ,24,Teacher() co
15、ut “Destructing teacher.n”; ; class Tutorpair public: Tutorpair() cout“Constructing tutorpair.n”; nomeetings=0; Tutorpair() cout“Destructing tutorpair.n”; ,25,protected: Student student; Teacher teacher; int nomeetings; ; void main() Tutorpair tp; cout“Back in main.n”; ,Constructing student.,Constru
16、cting teacher.,Constructing tutorpair.,Back in main.,Destructing tutorpair.,Destructing teacher.,Destructing student.,运行结果:,26,举例,class Point private: float x,y; /点的坐标 public: Point(float h,float v); /构造函数 float GetX(void); /取X坐标 float GetY(void); /取Y坐标 void Draw(void); /在(x,y)处画点 ; /.函数的实现略,class L
17、ine private: /线段的两个端点 Point p1,p2; public: /构造函数 Line(Point a,Point b); /画出线段 Void Draw(void); /.函数的实现略,类 的 组 合,27,类组合的构造函数设计,原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。 声明形式: 类名:类名(对象成员所需的形参,本类成员形参) :对象1(参数),对象2(参数),. 本类初始化 ,类 的 组 合,28,类组合构造函数实例,Point(int xx=0,int yy=0) x=xx;y=yy; Line:Line(Point a,Point
18、b,double p):p1(a),p2(b) double x=double(p1.GetX()-p2.GetX(); double y=double(p1.GetY()-p2.GetY(); dist=sqrt(x*x+y*y); price=p; ,类 的 组 合,29,类组合的构造函数调用,构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反) 若调用默认构造函数(即无形参的),则内嵌对象的初始化也将调用相应的默认构造函数。,类 的 组 合,30,类的组合举例1,#include #include using namespace std; class Point private: float x,y; /点的坐标 public: Point(float xx,float yy) cout“Point构造函数”endl; x=xx;y=yy; Point(Point ,类 的 组 合,31,class Distance private: Point p1,p2; /线段的两个端点 double dist; public: Distance(Point a,Point b); /构造函数 double GetDis(void)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/SDIE 25-2025 T/SDII 11-2025基于区块链的医疗数据共享安全要求
- T/CZGJ 002-2025地方铁路400MHz数字无线通信系统技术条件
- T/CI 1210-2025软土地基深层加固与沉降控制综合技术规程
- T/AHMT 1-2025纳米级电涡流位移传感器
- T/CNHAW 0015-2025临床应用药物分析检测通用要求
- AI在人文教育中的应用
- 2026学年江苏省启东市一年级语文期末评估冲刺押宝题(详细参考解析)详细答案和解析
- 脚手架搭设与拆除安全作业培训
- Photoshop 综合测试试题(三)及详细参考答案
- 干挂石材幕墙龙骨焊接及挂件安装方案
- 2026年时事政治考题及参考答案
- 4.3 化学键(教案)2022-2023学年高一化学人教版(2019)必修第一册
- 2026年秋新教材统编版九年级上册历史全册教案(含教学反思)
- 施工现场污水沉淀池设计
- 2026人教版五年级数学上册第四单元第3课《平移(2)》课件
- 新版人教版四年级上册数学全册教案(完整版)教学设计含教学反思
- 医院物价管理制度 (三)
- 饮用水水源地保护项目水资源论证报告书
- 26年老年群体心理照护宣教课件
- 2026物业管理行业市场供需分析及投资评估规划分析研究报告
- T/CHES 59-2021组合式金属防洪挡板安装、验收及维护规范
评论
0/150
提交评论