欢迎来到天天文库
浏览记录
ID:46525296
大小:72.00 KB
页数:22页
时间:2019-11-24
《钱能C++程序设计教程9》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C++程序设计教程(第二版)第九章对象生灭Chapter9ObjectBirth&Death清华大学出版社钱能9/15/20211第九章内容构造函数设计(ConstructorDesign)构造函数重载(ConstructorOverload)类成员初始化(ClassMemberInitializations)构造顺序(ConstructingOrder)拷贝构造函数(CopyConstructors)析构函数(Destructors)转型与赋值(Conversion&Assignment)9/15/202121.构造函数设计(
2、ConstructorDesign)初始化要求:对象与变量的不同在于对象对应于事物,要求从诞生之时起便有明确的意义.封装性要求:初始化不是简单的参数与成员对应,而是联系参数到成员的过程.构造函数名:该过程产生对象,而不是捆绑对象的成员函数调用,因而它是特殊的成员函数形式:与变量的定义形式保持一致.构造函数原则上不能失败,也没有返回形式例外:一次性对象构造,没有对象名,与强制转换的形式一致,因而它是一个特定类型的对象.9/15/202132.构造函数重载(ConstructorOverload)构造函数可以重载,也可以参数默认:c
3、lassDate{public:Date(conststring&s);Date(inty=2003,intm=12,intd=1);//...};intmain(){Dated(“2006-12-26”);Datee(2000,12,25);Datef(2001,10);Dateg(2002);Dateh();//...}9/15/20214若类中没有定义构造函数,则系统会默认定义一个无参空函数:classDate{public://相当于定义了Date(){}};intmain(){Dated;//ok//...}9/15/
4、20215任何其他的构造函数定义,都将阻止默认无参空函数的产生:classDate{public:Date(inty,intm,intd){}//...};intmain(){Dated;//error//...}9/15/202163.类成员初始化(ClassMemberInitializations)classStudentID{inta;public:StudentID(){a=1;cout<<“StudentId:"<5、ic:Student(stringn="noName"){cout<<“Student:"+n+"";name=n;}};intmain(){Students("Randy");}数据成员的空间分配是在构造函数被调用和其过程被执行之间的刹那间完成,在类中有对象成员时,那个刹那间便是调用对象所在类的构造函数,以创建对象空间的时机,左边的程序得到下列运行结果:StudentId:1Student:Randy说明先成员构造,后自身构造.成员构造不见显式调用,而是悄悄调用无参构造函数.9/15/20217classStudentI6、D{inta;public:StudentID(intid=0){a=id;cout<<“StudentId:"<7、左边形式.其运行结果为:StudentId:98Student:RandyStudentId:0Student:Jenny9/15/202184.构造顺序(ConstructingOrder)对象或变量创建的语句行顺序与运行顺序:inta=3;if(a==2)Dated;Datee;则对象创建的语句行顺序为:Dated--->Datee对象创建的运行顺序为:Datee9/15/20219同一工程不同代码文件全局对象的创建没有明确顺序规定.对策:不要让不同文件的全局对象互为依赖.因为依赖具有先后性,而其全局对象的创建不能保证该8、依赖性发挥作用.全局对象在main函数启动之前生成,而调试则在main函数启动之后.对策:调试时,应先将全局对象作为局部对象来运行观察.或者,在构造函数中添加输出语句来观察运行过程.9/15/202110成员对象的构造顺序按类定义的出现顺序,最后执行自身构造函数
5、ic:Student(stringn="noName"){cout<<“Student:"+n+"";name=n;}};intmain(){Students("Randy");}数据成员的空间分配是在构造函数被调用和其过程被执行之间的刹那间完成,在类中有对象成员时,那个刹那间便是调用对象所在类的构造函数,以创建对象空间的时机,左边的程序得到下列运行结果:StudentId:1Student:Randy说明先成员构造,后自身构造.成员构造不见显式调用,而是悄悄调用无参构造函数.9/15/20217classStudentI
6、D{inta;public:StudentID(intid=0){a=id;cout<<“StudentId:"<7、左边形式.其运行结果为:StudentId:98Student:RandyStudentId:0Student:Jenny9/15/202184.构造顺序(ConstructingOrder)对象或变量创建的语句行顺序与运行顺序:inta=3;if(a==2)Dated;Datee;则对象创建的语句行顺序为:Dated--->Datee对象创建的运行顺序为:Datee9/15/20219同一工程不同代码文件全局对象的创建没有明确顺序规定.对策:不要让不同文件的全局对象互为依赖.因为依赖具有先后性,而其全局对象的创建不能保证该8、依赖性发挥作用.全局对象在main函数启动之前生成,而调试则在main函数启动之后.对策:调试时,应先将全局对象作为局部对象来运行观察.或者,在构造函数中添加输出语句来观察运行过程.9/15/202110成员对象的构造顺序按类定义的出现顺序,最后执行自身构造函数
7、左边形式.其运行结果为:StudentId:98Student:RandyStudentId:0Student:Jenny9/15/202184.构造顺序(ConstructingOrder)对象或变量创建的语句行顺序与运行顺序:inta=3;if(a==2)Dated;Datee;则对象创建的语句行顺序为:Dated--->Datee对象创建的运行顺序为:Datee9/15/20219同一工程不同代码文件全局对象的创建没有明确顺序规定.对策:不要让不同文件的全局对象互为依赖.因为依赖具有先后性,而其全局对象的创建不能保证该
8、依赖性发挥作用.全局对象在main函数启动之前生成,而调试则在main函数启动之后.对策:调试时,应先将全局对象作为局部对象来运行观察.或者,在构造函数中添加输出语句来观察运行过程.9/15/202110成员对象的构造顺序按类定义的出现顺序,最后执行自身构造函数
此文档下载收益归作者所有