关于派生类的构造的——一个程序的分析(钱能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
相关文章推荐
- 关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数
- c++学习笔记4,调用派生类的顺序构造和析构函数(一个)
- C/C++拾遗录--关于一个C语言小程序的分析
- 一个简单关于学生成绩管理的C++程序代码,但是对于拷贝析构函数目前还是不知其作用何在
- C++ 派生类的构造和析构函数
- 一个关于时间的故事(通过历史分析解决程序问题)
- 一个关于c++数值转换的小程序的思考
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
- 关于指针和形参结合的一个程序的分析
- C/C++日常学习总结(第十六篇)分析IA-64和IA-32位机器上同一个程序运行,前者报错,后者正常
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 一个关于时间的故事(通过历史分析解决程序问题)
- 一个程序理解C++的构造函数、析构函数和赋值函数
- 分析一个写图片的c++程序
- C/C++问答(3):关于构造和析构函数使用多态
- 逆向分析一个完整的C++程序包含寄存器与参数传递详解
- 【程序语言】C++ 构造函数 拷贝构造函数 =操作符重载 析构函数 详细分析
- 请大家推荐好书:通过分析一个较大的程序来学习C++
- C/C++拾遗录--关于一个C语言小程序的分析
- 逆向分析一个完整的C++程序包含寄存器与参数传递详解