版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章构造函数和析构函数,10.1 构造函数,简单类型变量的初始化方法 int x=5; float y=10.0 数组的初始化 float a=10.5,11,21.0,30.0; char str=China; 结构体变量的初始化 struct ABC int x; int y; ; ABC sa=10,20;,10.1 构造函数,类对象(类变量)的初始化,class ABC public: int x,y; int a,b; void print() coutx=xendl; couty=yendl; couta=aendl; coutb=bendl; ; ; int main(int
2、argc, char* argv) int x; ABC sa=10,20; sa.print(); ,/结果 x=10 y=20 a=0 b=0,10.1 构造函数,类对象(类变量)的初始化,class ABC private: int x,y; public: int a,b; void print() coutx=xendl; couty=yendl; couta=aendl; coutb=bendl; ; ; int main(int argc, char* argv) int x; ABC sa=10,20; sa.print(); ,只要类定义中有私有成员(无论是数据成员还是函数成
3、员),则无法直接初始化 对于类对象的初始化方法 构造函数,10.1.1 构造函数的定义及对象初始化,class ABC private: int x,y, a,b; public: ABC() x=0;y=0;a=0;b=0; ABC(int x1,int y1,int a1=100,int b1=100); int getx()return x; int gety()return y; int geta()return a; int getb()return b; void print(); ;,说明: 1.构造函数名与类名必须相同 2.构造函数不能有任何返回类型,包括void也不行 3.一
4、个类可以定义多个构造函数构造函数的重载 4.一般,构造函数总是定义成公有的,特殊情况下才定义成保护型,10.1.1 构造函数的定义及对象初始化,ABC: ABC(int x1,int y1,int a1,int b1) x=x1; y=y1; a=a1; b=b1; void ABC:print() coutx=getx()endl; couty=gety()endl; couta=geta()endl; coutb=getb()endl; ,说明: 5.构造函数既可以在类声明中定义,也可以在类声明外定义,10.1.1 构造函数的定义及对象初始化,void main() ABC sa1;/调用
5、第一个构造函数,不能写成 ABC sa1(); ABC sa2(10,20); /调用第二个构造函数 ABC sa3(100,200,300,400); /调用第二个构造函数 coutsa1中endl; sa1.print(); coutsa2中endl; sa2.print(); coutsa3中endl; sa3.print(); ,说明:系统在生成类的对象时,自动调用该类的构造函数初始化对象,无需显式调用。,产生全局对象、静态对象和局部对象时调用构造函数的时机 (参考P221-223例10.5及解释),使用构造函数初始化,#include class dataclass private:
6、 int privatedata; public: dataclass(int value); int publicdata; int publicmethod(void); dataclass:dataclass(int value) privatedata=value; int dataclass:publicmethod(void) return privatedata; void main() dataclass dataobject(1); dataobject.publicdata=2; cout“dataobject.publicdata=“dataobject.publicda
7、ta; cout“dataobject.privatedata=“dataobject.publicmethod()n; ,10.1.3 构造函数和new运算符,定义类对象指针,然后用new运算符为类对象指针分配空间及初始化自动调用构造函数,class TD private: int x,y; public: TD(int x1,int y1) x=x1; y=y1; cout 调用构造函数TD(int,int)n ; TD() cout调用构造函数TD()n; void showXY() coutx=xt; couty=yendl; ;,void main() TD *pd=new TD(5
8、,10);/调用带参构造函数 pd-showXY(); TD *p=new TD; /调用不带参构造函数 p-showXY(); delete pd; delete p; ,调用构造函数TD(int,int) x=5 y=10 调用构造函数TD() x=844586344 y=844586344,10.1.4 缺省构造函数,1.C+规定,每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。 2.如果在定义类时没有定义任何构造函数,则C+自动生成一个缺省构造函数。其格式为: className:className() 即一个空的构造函数 缺省构造函数只能有一个 3.只要一个类显式地定义了
9、一个构造函数,则C+就不再提供默认的构造函数。也就是说,如果为类定义了一个带参数的构造函数,但在编程中,还想使用无参数的构造函数,则必须自己定义。 4.当使用默认构造函数创建全局对象时,对象的数据成员的值默认取0;而使用默认构造函数创建局部对象时,对象的的数据成员的值是随机数; 5.要对对象的数据成员进行初始化,必须定义构造函数 6.定义类的对象时,系统必定调用构造函数对某个对象来说,构造函数必须唯一。,(1)在类中,若定义了没有参数的构造函数或各参数均有缺省值的构造函数,则此构造函数也可看成是缺省构造函数,缺省构造函数在一个类中只能有一个. (2)任意一种形式的构造函数必须唯一 (3)缺省构
10、造函数的调用: 类名 对象名;,10.1.4 缺省构造函数,#include class Q int x,y; public: Q(int a=0,int b=0) x=a;y=b; void p() coutxtyn; ; void main() cout welcome your executive!n; Q q; q.p(); Q q1(50,100); q1.p(); Q q2(500); q2.p(); coutdo you understand it?; ,0 0,缺省的构造函数,50 100,500 0,50 100,10.1.4 缺省构造函数,class E private:
11、int x,y; public: E(int a,int b) x=a;y=b; void p() coutxt; coutyn; ; E e; /错误,为什么?,class Q private: int x,y; public: Q(int a=0,int b=0) x=a;y=b; Q(); void p() coutxt; coutyn; ; Q q;/错误,为什么?,产生对象e时没有合适的构造函数可用,产生对象q时,有两个构造函数可用,不知用哪一个,Q qq();/什么意思? 说明了一个全局函数qq, 该函数返回值类型为类类型Q 当使用类的缺省构造函数创建一个对象时,对象名后不能带括号
12、“()” Q qq,10.2 析构函数,class student private: char *name; /. public: student(char *pnane) name=new char(12); student() delete name; ;,为什么要使用析构函数?,构造函数中分配了内存,析构函数中释放内存,在定义一个对象时要为对象分配存储空间; 在对象结束其生命期或作用域时,系统要收回对象所占的存储空间,即要撤消对象。 析构函数完成撤消对象的工作。,10.2.1 析构函数的定义,格式: className() /析构函数名 /析构函数体,说明: 规定: 析构函数名必须与类名
13、相同,并在其前面加上字符“” 析构函数不能有任何类型形式参数,void也不行,不能有任何返回类型,void也不行。 析构函数是唯一的,不能重载。 析构函数在撤消对象时自动调用,10.2.2 不同存储类型调用构造函数及析构函数的时机,在定义对象时调用构造函数,撤消对象时调用析构函数 对不同存储类型的对象(全局对象,静态对象,局部对象),调用构造函数和析构函数的时机不同。,全局对象:程序执行时,调用构造函数,程序结束时调用析构函数; 局部对象(函数内定义):程序执行到定义对象的地方,调用构造函数,退出对象作用域时,调用析构函数; static定义的局部对象:首次执行对象的定义时,调用构造函数,程序
14、结束时调用析构函数 new运算符生成的对象:用new产生对象时调用构造函数,用delete释放对象时,调用析构函数,10.2.3 用delete运算符撤消对象数组,class Q private: int x,y; public: Q(int a=0,int b=0) x=a;y=b; cout调用构造函数n; Q() cout调用析构函数n; void p() coutxt; coutyn; ;,void main() Q *q=new Q2; cout=n; delete q; cout退出主函数; ,调用构造函数 调用构造函数 = 调用析构函数 调用析构函数 退出主函数,10.2.4 缺
15、省的析构函数,如果在定义类时没有显式地定义析构函数,则C+自动生成一个缺省析构函数。其格式为: className:className() 即一个空的析构函数 如果在构造函数中利用new运算符分配了内存空间,则必须显式地定义析构函数来释放内存空间,10.4 实现类型转换的构造函数,4/8=? 4.0/8=?,4.0/8匹配了两个double类型数的除法,C+知道何时将8转换成double型,这是基本数据类型的转换。 对于用户自定义数据类型如何转换呢? 必须由用户告知 用户告知的方式就是定义一个含参数的构造函数。,10.4 实现类型转换的构造函数,如果有重载函数fn(char*),则调用fn(J
16、enny)马上匹配了事,但是由于没有这样的重载函数,所以C+试着对函数fn()的参数进行类型转换。 因为有student(char *)这样的构造函数,又有fn(student / void fn(student / ,10.4 使用隐含地实现类型转换的构造函数,class EX int x; public: EX(int a) x=a; coutx=xt调用了构造函数n; EX() cout调用了析构函数n; ; void main() EX x1(50); EX x2=100; x2=200; cout主程序结束n; ,x=50 调用了构造函数 x=100 调用了构造函数 x=200 调用
17、了构造函数 调用了析构函数 主程序结束 调用了析构函数 调用了析构函数,10.4 显式地使用实现类型转换的构造函数,当构造函数有多个参数时,必须通过构造函数进行强制类型转换。 用构造函数进行强制类型转换的一般格式:classname(a1,a2,an) 其作用是调用对应的带有n个参数的构造函数,产生一个临时对象,用参数a1,a2,an 初始化该临时对象后,将该对象作为操作数参加运算。运算结束后,系统自动地撤消这个临时对象。,10.4 显式地使用实现类型转换的构造函数,class EX int x,y; public: EX(int a, int b) x=a; y=b; coutxt y 调用
18、了构造函数n; EX() cout调用了析构函数n; ; void main() EX x1(50,100); x1= EX (300,600); cout主程序结束n; ,50 100 调用了构造函数 300 600 调用了构造函数 调用了析构函数 主程序结束 调用了析构函数,10.3 拷贝构造函数,什么叫对象的拷贝? 制做一个对象的副本 什么时候需要对象拷贝? 以类对象作为函数参数传值调用时; 函数返回值为类对象; 用一个已定义的对象去初始化一个新对象时;,10.3 拷贝构造函数,格式: className(className public: Q(int a=0,int b=0) x=a;
19、y=b; cout调用构造函数n; Q(Q ,调用构造函数 调用拷贝构造函数 调用拷贝构造函数 10 20 10 20 10 20 调用拷贝构造函数 调用析构函数 调用析构函数 调用析构函数 调用析构函数,void fun(Q q) ; void main() Q q1(10,20); Q q2=q1; Q q3(q2); q1.p(); q2.p(); q3.p(); fun(q1); ,10.3 隐含的拷贝构造函数,如果在定义类时没有定义一个复制数据成员的构造函数,则C+自动生成一个隐含的完成拷贝功能的构造函数,依次完成类中对应数据成员的复制。其格式为: className:classNa
20、me(className,class Q private: int x,y; public: Q(int a=0,int b=0) x=a;y=b; cout调用构造函数n; Q() cout调用析构函数n; void p() coutxt; coutyn; ;,调用构造函数 10 20 10 20 10 20 调用析构函数 调用析构函数 调用析构函数 调用析构函数,void fun(Q q) ; void main() Q q1(10,20); Q q2=q1; Q q3(q2); q1.p(); q2.p(); q3.p(); fun(q1); ,10.3隐含的拷贝构造函数,class Q private: int x,y; char *s; public: Q(int a=0,int b=0) x=a;y=b; s=Great China ; cout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年绍兴市上虞区中医医院医共体招聘编外人员5人模拟笔试试题及答案解析
- 2025年福建泉州惠安县宏福殡仪服务有限公司招聘5人参考考试试题及答案解析
- 2025年杭州市上城区闸弄口街道社区卫生服务中心招聘编外1人考试参考试题及答案解析
- 深度解析(2026)GBT 26103.5-2010NGCLZ型带制动轮鼓形齿式联轴器
- 2025浙江宁波市象山半边山紫冠投资有限公司酒店管理分公司(宁波象山海景皇冠假日酒店)招聘3人参考考试题库及答案解析
- 深度解析(2026)《GBT 25982-2024客车车内噪声限值及测量方法》(2026年)深度解析
- 2025四川德阳市旌阳区孝泉镇卫生院(旌阳区第二人民医院)招聘2人备考笔试题库及答案解析
- 深度解析(2026)《GBT 25796-2010反应艳黄W-2G(C.I.反应黄39)》
- 深度解析(2026)《GBT 25734-2010牦牛肉干》(2026年)深度解析
- 深度解析(2026)《GBT 25688.2-2010土方机械 维修工具 第2部分:机械式拉拔器和推拔器》
- 2025至2030中国聚四氟乙烯(PTFE)行业经营状况及投融资动态研究报告
- 教育、科技、人才一体化发展
- 营销与客户关系管理-深度研究
- 耐压试验操作人员岗位职责
- 2020-2021学年广东省广州市黄埔区二年级(上)期末数学试卷
- 财政部政府采购法律法规与政策学习知识考试题库(附答案)
- 长鑫存储在线测评题
- DL∕T 5344-2018 电力光纤通信工程验收规范
- T-CCIIA 0004-2024 精细化工产品分类
- 世界当代史教材
- 高压电动机保护原理及配置
评论
0/150
提交评论