如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第4.3节构造函数与析构函数本章主要内容1、问题提出1、对象是现实世界的实体,建立对象,需要一个有意义的初始值。2、初始化对象的过程在对象建立时,自动初始化。3、善后处理。类的封装,就体现在一部分是不能让外界访问的。所以直接在非成员函数中访问类对象的保护或私有的数据是不允许的。类对象的初始化任务,自然落在了类的成员函数身上,因为它们可以访问保护和私有数据成员。将初始化工作交由普通成员函数,让系统多了一道处理初始化的解释与执行,因为它意味着在编写应用程序中每当建立对象时,都要增加书写代码。这样实现类机制不理想。3、解决方案希望每建立一个对象的同时,自动实现初始化,省去人为调用的麻烦。称此特殊函数为:构造函数。函数名用类名总结:构造函数是一种用于创建对象特殊的成员函数当创建对象时,系统自动调用构造函数,不能在程序中直接调用构造函数的作用是:为对象分配空间;对数据成员赋初值;请求其他资源构造函数是必须的。当没有用户定义的构造函数时,系统提供缺省版本的构造函数系统缺省版本的构造函数做公共初始化工作;用户提供版本的构造函数做用户要求的初始化工作构造函数名与类名相同一个类可以拥有多个构造函数(重载)构造函数可以有任意类型的参数,但不能具有返回类型构造函数是专门用于建立对象和为其初始化的一个成员函数,构造函数名和类名相同,并且不具有任何返回类型,即使是void也不可以。可以在构造函数中使用无值返回语句“return;”语句,但不可以通过构造函数返回任何类型的值。例如:ch12_1.cppDesk::Desk()//构造函数定义{weight=10;high=5;width=5;length=5;cout<<weight<<""<<high<<""<<width<<""<<length<<endl;}Stool::Stool()//构造函数定义{weight=6;high=3;width=3;length=3;cout<<weight<<""<<high<<""<<width<<""<<length<<endl;}如果一个类对象是另一个类的数据成员,则在那个类的对象创建所调用的构造函数中,对该成员(对象)自动调用其构造函数。例如:ch12_2.cpp#include<iostream.h>classStudent{public:Student(){cout<<"constructingstudent.\n";semesHours=100;gpa=3.5;}//其他公共成员protected:intsemesHours;floatgpa;};classTeacher{public:Teacher(){cout<<"constructingteacher.\n";}};§4.3.3析构函数#include<iostream.h>//ch12_3.cppclassStudent{public:Student(){cout<<"constructingstudent.\n";semesHours=100;gpa=3.5;}~Student(){cout<<"destructingstudent.\n";}//其他公共成员protected:intsemesHours;floatgpa;};classTeacher{public:Teacher(){cout<<"constructingteacher.\n";}~Teacher(){cout<<"destructingteacher.\n";}};classTutorPair{public:TutorPair(){cout<<"constructingtutorpair.\n";noMeetings=0;}~TutorPair(){cout<<"destructingtutorpair.\n";}protected:Studentstudent;Teacherteacher;intnoMeetings;};voidmain(){TutorPairtp;cout<<"backinmain.\n";}§4.3.4带参数的构造函数例如:ch12_4.cpp简单例子//ex4_2#include<iostream.h>classLocation{public:Location(intxx,intyy);//构造函数~Location();//析构函数intGetX();intGetY();private:intX,Y;};Location::Location(intxx,intyy){X=xx;Y