您的位置:首页 > 编程语言 > C语言/C++

关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数

2010-06-06 00:06 441 查看
#include <iostream.h>
#include <string.h>
class Advisor
{
public:
Advisor()
{
cout<<"Construct Advisor"<<endl;
cout<<endl;
}
Advisor(Advisor& ad)
{
cout<<"copyConstruct Advisor"<<endl;
}
~Advisor()
{
cout<<"destruct Advisor"<<endl;
}
int noOfMeeting;
};
class Student
{
public:
Student(char* pName="no name"){

cout<<"Construct Student"<<endl;
strcpy(name,pName);
average=0;
semesterHours=0;
}
Student(Student& st)
{
cout<<"copy construct Student"<<endl;
}
~Student()
{
cout<<"destruct Student"<<endl;
}
void addCourse(int hours,float grade){

average=(semesterHours*average+grade);
semesterHours+=hours;
average/=semesterHours;
}
int getHours(){return semesterHours;}
float getAverage(){return average;}

void display(){

cout<<"name= "<<name<<"/n"
<<"hours="<<semesterHours<<"/n"
<<"average="<<average<<endl;
}
protected:
char name[40];
int semesterHours;
float average;
};
class GraduateStudent:public Student
{
public:
GraduateStudent(char* pName,Advisor& adv)
:Student(pName),advisor(adv)
{
cout<<"Construct GraduateStudent"<<endl;
qualifierGrade=0;
}
GraduateStudent(GraduateStudent& grad)
{
cout<<"copy GraduateStudent&<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>quot;<<endl;
}
~GraduateStudent()
{
cout<<"destruct GraduateStudent"<<endl;
}

int getQualifier(){return qualifierGrade;}
protected:
Advisor advisor;
int qualifierGrade;
};
GraduateStudent fn(Advisor& advisor){

cout<<"come to fn()"<<endl;
//	cout<<endl;
GraduateStudent gs("Yen Kay Doodle",advisor);
cout<<"in fn()"<<endl;
cout<<endl;
return gs;
}
void main(){
/*	Student ds("Lo Lee Undergrad");
GraduateStudent gs;
ds.addCourse(3,2.5);
ds.display();
gs.display();
gs.addCourse(3,3.0);
gs.display();*/
Advisor da;
GraduateStudent gs=fn(da);
cout<<"return main()"<<endl;
cout<<endl;
//	fn(da);
//	gs.display();
//	cout<<sizeof(gs)<<endl;
}
/*
运行结果:
Construct Advisor   //main函数中第一句,先构造一个Advisor对象
come to fn()			//来到fn中
//以下开始执行fn()中的构造gs操作,
//C++操作顺序为先划分好内存空间:依次为Student,Advisor,qualifierGrade——即成员声明的顺序
Construct Student		//先从基类Student开始,调用其构造函数来完成构造。——graduateStudent没有权力来操作作为它的成员的Student类,各干各的事
copyConstruct Advisor	//接着调用Advisor
Construct GraduateStudent //最后调用自己的构造函数来完成新增变量qualifierGrade的赋值
in fn()
//以下要return 一个gs,所以要产生临时对象(无名对象).用的是拷贝构造
Construct Student 			//对Student来说,还是调用其构造,而不是拷贝构造,因为这是GraduteStudent的拷贝构造,而不是Student的拷贝构造
Construct Advisor			//同上

copy GraduateStudent		//轮到调用自己的拷贝构造函数来完成无名对象的新建
//以下完成fn()中gs对象的析构,依次调用各个成员的析构函数
destruct GraduateStudent
destruct Advisor
destruct Student
return main()
// 以下完成main()中gs对象的析构,依次调用各个成员的析构函数
destruct GraduateStudent   
destruct Advisor
destruct Student
//对第一行产生的Advisor析构
destruct Advisor
Press any key to continue
*/


运行结果:

Construct Advisor    //main函数中第一句,先构造一个Advisor对象

come to fn() //来到fn中

//以下开始执行fn()中的构造gs操作,

//C++操作顺序为先划分好内存空间:依次为Student,Advisor,qualifierGrade——即成员声明的顺序

Construct Student //先从基类Student开始,调用其构造函数来完成构造。——graduateStudent没有权力来操作作为它的成员 //的Student类,各干各的事

copyConstruct Advisor //接着调用Advisor

Construct GraduateStudent //最后调用自己的构造函数来完成新增变量qualifierGrade的赋值

in fn()

//以下要return 一个gs,所以要产生临时对象(无名对象).用的是拷贝构造

Construct Student  //对Student来说,还是调用其构造,而不是拷贝构造,因为这是GraduteStudent的拷贝构 //造,而不是Student的拷贝构造

Construct Advisor //同上

copy GraduateStudent //轮到调用自己的拷贝构造函数来完成无名对象的新建

//以下完成fn()中gs对象的析构,依次调用各个成员的析构函数

destruct GraduateStudent

destruct Advisor

destruct Student

return main()

// 以下完成main()中gs对象的析构,依次调用各个成员的析构函数

destruct GraduateStudent   

destruct Advisor

destruct Student

//对第一行产生的Advisor析构

destruct Advisor

Press any key to continue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐