第十一周阅读程序4:基类、派生类中构造函数、析构函数执行过程
2015-05-20 14:38
435 查看
问题及代码:
1.先分析程序的执行结果,在上机时运行程序进行对照,再通过单步执行跟踪程序的运行,达到理解基类、派生类中构造函数、析构函数执行过程的目的。
2.将Whole类的构造函数(见注释//问题2)改为下面形式,请解释出现的警告信息。
运行结果:
知识点总结:
/*
调用f()
构建 Whole w1;
val=0;
先是基类的构造函数
cout<<"调用Part的默认构造函数:"<<"0"<<endl;
在 w1中 有两个Part类的对象作为数据成员,所以
cout<<"调用Part的构造函数: "<<"0"<<endl;
cout<<"调用Part的构造函数: "<<"0"<<endl;
再是派生类的构造函数
data=0;
cout<<"调用whole的默认构造函数: "<<"0"<<endl;
构建 Whole w2(1,2,3,4);
val=i; 即val=1;
cout<<"调用Part的构造函数: "<<"1"<<endl;
Part one构造函数 赋予j的值 即 3
cout<<"调用Part的构造函数: "<<"3"<<endl;
Part two构造函数 赋予i的值 即 2
cout<<"调用Part的构造函数: "<<"2"<<endl;
whole的构造函数 输出data的值 即 4
cout<<"调用whole的构造函数: "<<"4"<<endl;
f()结束
调用析构函数
Whole w2(1,2,3,4);
先析构派生类
cout<<"调用whole的析构函数: "<<"4"<<endl;
再基类
Part two析构函数 val=2
cout<<"调用Part的析构函数: "<<"2"<<endl;
Part one析构函数 val=3
cout<<"调用Part的析构函数: "<<"3"<<endl;
基类中自己的数据成员的析构
cout<<"调用Part的析构函数: "<<"1"<<endl;
Whole w1;
先析构派生类
cout<<"调用whole的析构函数: "<<"0"<<endl;
再析构基类
cout<<"调用Part的析构函数: "<<"0"<<endl;
cout<<"调用Part的析构函数: "<<"0"<<endl;
cout<<"调用Part的析构函数: "<<"0"<<endl;
*/
将Whole类的构造函数(见注释//问题2)改为下面形式,请解释出现的警告信息。
参数列表与对应给出的形参不对应,而在程序编译的时候,实际是调整回了对应的位置。
而这样设计程序,会造成程序的可读性变差
1.先分析程序的执行结果,在上机时运行程序进行对照,再通过单步执行跟踪程序的运行,达到理解基类、派生类中构造函数、析构函数执行过程的目的。
2.将Whole类的构造函数(见注释//问题2)改为下面形式,请解释出现的警告信息。
#include <iostream> using namespace std; class Part //部件类 { public: Part(); Part(int i); ~Part(); private: int val; }; Part::Part() { val=0; cout<<"调用Part的默认构造函数:"<<val<<endl; } Part::Part(int i) { val=i; cout<<"调用Part的构造函数: "<<val<<endl; } Part::~Part() { cout<<"调用Part的析构函数: "<<val<<endl; } class Whole: public Part { public: Whole(); Whole(int,int,int,int); ~Whole(); private: Part one; Part two; int data; }; Whole::Whole() { data=0; cout<<"调用whole的默认构造函数: "<<data<<endl; } Whole::Whole(int p, int i,int j,int k):Part(p),one(j),two(i),data(k) //问题2 { cout<<"调用whole的构造函数: "<<data<<endl; } Whole::~Whole() { cout<<"调用whole的析构函数: "<<data<<endl; } void f() { Whole w1; Whole w2(1,2,3,4); } int main() { f(); return 0; }
运行结果:
知识点总结:
/*
调用f()
构建 Whole w1;
val=0;
先是基类的构造函数
cout<<"调用Part的默认构造函数:"<<"0"<<endl;
在 w1中 有两个Part类的对象作为数据成员,所以
cout<<"调用Part的构造函数: "<<"0"<<endl;
cout<<"调用Part的构造函数: "<<"0"<<endl;
再是派生类的构造函数
data=0;
cout<<"调用whole的默认构造函数: "<<"0"<<endl;
构建 Whole w2(1,2,3,4);
val=i; 即val=1;
cout<<"调用Part的构造函数: "<<"1"<<endl;
Part one构造函数 赋予j的值 即 3
cout<<"调用Part的构造函数: "<<"3"<<endl;
Part two构造函数 赋予i的值 即 2
cout<<"调用Part的构造函数: "<<"2"<<endl;
whole的构造函数 输出data的值 即 4
cout<<"调用whole的构造函数: "<<"4"<<endl;
f()结束
调用析构函数
Whole w2(1,2,3,4);
先析构派生类
cout<<"调用whole的析构函数: "<<"4"<<endl;
再基类
Part two析构函数 val=2
cout<<"调用Part的析构函数: "<<"2"<<endl;
Part one析构函数 val=3
cout<<"调用Part的析构函数: "<<"3"<<endl;
基类中自己的数据成员的析构
cout<<"调用Part的析构函数: "<<"1"<<endl;
Whole w1;
先析构派生类
cout<<"调用whole的析构函数: "<<"0"<<endl;
再析构基类
cout<<"调用Part的析构函数: "<<"0"<<endl;
cout<<"调用Part的析构函数: "<<"0"<<endl;
cout<<"调用Part的析构函数: "<<"0"<<endl;
*/
将Whole类的构造函数(见注释//问题2)改为下面形式,请解释出现的警告信息。
Whole::Whole(int p, int i,int j,int k): Part(p),two(i),one(j),data(k) //问题2
参数列表与对应给出的形参不对应,而在程序编译的时候,实际是调整回了对应的位置。
而这样设计程序,会造成程序的可读性变差
相关文章推荐
- 第十一周阅读程序5:基类与派生类的构造函数与析构函数
- 第十一周阅读程序6:基类、派生类中构造函数、析构函数
- 第十一周 领会继承以及基类、派生类中构造函数的写法以及执行过程
- 第十一周阅读程序1:继承与派生类的构造函数和析构函数
- 第十一周 阅读程序 构造函数与虚构函数中继承执行先后
- C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
- 关于基类和派生类的构造函数和析构函数的执行顺序问题
- 第十一周 阅读程序4 类的继承构造函数与析构函数调用的先后顺序
- 基类和派生类的构造函数和析构函数执行顺序
- 关于基类和派生类的构造函数和析构函数的执行顺序问题
- C++ 虚基类问题、继承体系中的构造函数执行过程。(
- 例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序
- 第四周项目零:程序阅读——构造函数和析构函数(1)
- 第4周课后实践·阅读程序-构造函数和析构函数(4)
- c++派生类和基类的构造函数和析构函数
- 派生类的构造函数赋值和析构函数执行顺序
- 第四周 程序阅读——构造函数和析构函数(三)
- C++中基类,派生类 类成员对象的构造函数,析构函数的顺序
- 派生类构造函数执行顺序及虚基类的概念
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765