【sy3_类组合的应用与编程_3_Whole】
实验内容
(3) ① 调试下列程序,写出输出结果,并分析输出结果。
#include <iostream>
using namespace std;
class Part
{public:Part(); //Part的无参构造函数Part (int x); // Part的有参构造函数~Part(); //Part的析构函数private:int val;
};
Part::Part()
{val=0;cout<<"Part类的默认构造函数被调用"<<endl;
}
Part::Part(int x)
{ val=x;cout<<"Part类的一个参数的构造函数被调用"<<","<<val<<endl;
}
Part::~Part()
{cout<<"Part类的析构函数被调用"<<","<<val<<endl;
}
class Whole
{public:Whole(int i); // Whole的有参构造函数Whole(){}; //Whole的无参构造函数~Whole(); //Whole的析构函数private:Part p1; //子对象Part p2; //子对象
};
Whole::Whole(int i): p1(),p2(i)
{cout<<"Whole类的构造函数被调用"<<endl;
}
Whole::~Whole()
{cout<<"Whole类的析构函数被调用"<<endl;
}
int main()
{ Whole w(3);//调用有参构造函数return 0;
}
② 如果在Whole类中增加一个private数据成员Part p3;然后将Whole类的有参构造函数的实现改为
Whole::Whole(int i):p2(i),p1()
{cout<<"Whole类的构造函数被调用"<<endl;
}
写出输出结果,并分析输出结果。
调试下列程序的分析与结果
①
1、输出结果:
2、分析输出结果:
该程序为类组合的知识点,需要理清楚两个类之间值的传递过程,以及构造函数和析构函数的调用时机。
首先,分析两个类的主要结构。如下:
编写程序:
Part部分类
在Part部分类部分类中定义了一个整型的val变量,以及
Part的无参构造函数Part();功能:将0赋值为val变量,同时输出被调用信息
Part的有参构造函数Part (int x);将x赋值给val变量,同时输出被调用信息
Part的析构函数~Part(); 用来释放由Part构造函数分配的内存
Whole整体类
类的组合,其中定义了p1,p2均为Part的子对象,同时也定义了三个成员函数
Whole的有参构造函数Whole(int i);
Whole的无参构造函数Whole(){};
Whole的析构函数~Whole();
其次,本实验的主要关键点在于Whole类构造函数初始化列表,即Whole::Whole(int i):p1(),p2(i){}:
构造函数的任务,就是初始化对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。在初始化时因为p1为Part类的对象,又因为不指定类对象的初始值时会触发默认构造函数的调用时机,所以在Whole对象传递值的同时,p1对象会调用Part类的默认构造函数。而p2也属于Part的子对象,由于存在值,在调用Whole(int i);的同时会将值传递给x,调用Part (int x);
根据上述分析,主函数中“Whole(3)”;调用Whole类的有参构造函数。因为C++初始化类成员时,是按照声明的顺序初始化的,故会首先检查p1对象的值情况,由于p1对象为Part类的子对象,且未指定对象的初始值,即调用“Part();”的无参构造函数
显示输出:Part类的默认构造函数被调用
此时3传入p2,因为p2对象为Part类的子对象,即“p2(3);”去先调用“Part (int x);”的有参构造函数
显示输出:Part类的一个参数的构造函数被调用,3
此时在Whole::Whole(int i):p1(),p2(i){}中,p1,p2初始化完成,即可调用“Whole(int i);”的有参构造函数
显示输出:Whole类的构造函数被调用
因为析构函数的调用时机一般都是编译器自动完成,不需要手动调用,且调用顺序是与构造函数调用顺序相反,故
显示输出:
Whole类的析构函数被调用
Part类的析构函数被调用,3
Part类的析构函数被调用,0
至于为什么最后一次调用“~Part();”val的值为0,是Part类中的无参构造函数“val=0;”
②
1、输出结果:
2、分析输出结果:
同理可知:Whole类在设定了3个Part子对象的前提下,去进行构造函数初始化列表。因为构造函数的任务,就是初始化对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。所以即使没有初始化p3,Part类的默认构造函数一九会被p3对象调用。显示输出:
Part类的默认构造函数被调用 //p1
**Part类的一个参数的构造函数被调用,3 ** //p2
**Part类的默认构造函数被调用 ** //p3
同理,因为因为C++初始化类成员时,是按照声明的顺序初始化的,所以p2放在前面不影响,显示输出:
Whole类的构造函数被调用
Whole类的析构函数被调用
Part类的析构函数被调用,0 //p3
Part类的析构函数被调用,3 //p2
Part类的析构函数被调用,0 //p1
【sy3_类组合的应用与编程_3_Whole】相关推荐
- java 枚举类组合在一起_Java,.NET,但为什么在一起?
java 枚举类组合在一起 十二年前,Sun微系统公司大张旗鼓地宣布了一种新的编程语言和环境,用于使网页更具动态性和"活力". 当然,现在,Java编程语言是一种无处不在的工具,它 ...
- 数控编程方法可以分为两类:一类是手工编程,另一类是自动编程
数控加工工作过程:如下图所示,在数控机床上加工零件时,要预先根据零件加工图样的要求确定零件加工的工艺过程.工艺参数和走刀运动数据,然后编制加工程序,传输给数控系统,在事先存入数控装置内部的控制软件支持 ...
- 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个60 ...
- c语言面向对象编程中的类_C ++中的面向对象编程
c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...
- 类的练习2——python编程从入门到实践
9-7 管理员: 管理员是一种特殊的用户.编写一个名为Admin的类,并让它继承练习9-3或者9-5的User类.添加一个名为privileges的属性,用于存储一个由字符串(如"can a ...
- python 类组合_python类与对象的组合与继承
1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...
- python 字符串变量 组合列表_Python智慧编程——第3讲 字符串与列表
第 3 课 Python 的字符串与列表 前面的课程中,我们通过Mu软件编程工具让Python做了一些基本的运算,并且学习了变量的概念以及使用.在这一课程里,我们会继续学习Python编程中的另一些内 ...
- Java黑皮书课后题第11章:11.3(Account类的子类)在编程练习题9.7中定义了一个Account类来对一个银行账户建模。一个账户有账号、余额、年利率、开户日期等属性,以及存款和取款等方法
续标题:创建支票账户checking account和储蓄账户saving account两个子类.支票账户有一个透支限定额,但储蓄账户不能透支 题目(续) 题目中提到的编程练习题9.7:以下代码直接 ...
- java编程一般类抽象类的定义,Java编程基础抽象类
本文主要是讲述Java编程基础-抽象类,更多Java技术知识,请登陆疯狂软件教育官网. 抽象类: 抽象:不具体,看不明白关键字abstract 抽象类的特点: 1.抽象方法只能定义在抽象类中,抽象类和 ...
最新文章
- Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
- html:(35):缩进和行高
- c语言链表集合求并集用字母表示,c语言实现的链表集合的并集与交集
- 在eclipse中配置server和database
- BizTalk 2002:Registering Custom Components
- mysql 一台电脑多个服务_怎么在一台windows主机上安装多个mysql服务
- 通达信l2接口公式代码怎么获取excel数据?
- 2019下半年计算机二级c语言,2019年下半年计算机二级C语言试题(4)
- [导入]运筹帷幄之中,决胜千里之外(搜索世界的监视器为你所用)
- 银行金融计算机考试成绩查询系统,速看!人民银行成绩出了!戳进查分数+看排名!...
- Mac安装redis并设置开机自启动
- Autojs-QQ每日定时给女票/男票/闺蜜/基友发送一句话
- Python如何删除多余的空格与空行(有代码)
- 数组下标越界异常是如何产生的
- 不得不看的经典软件测试面试问题
- 服务器 无线 有线,【干货】有线无线一体化移动网
- 创业公司融资,股权是如何一步步被稀释的?
- 《Python从入门到实践》读书笔记——第五章 if语句
- 微信小程序组件化开发框架wepy 学习(二)
- 一年时间,拿到了人生中的第一个10万
热门文章
- javaSE (十七)Date、SimpleDateFormat、Calendar类的方法(计算在这个世界上生活多少天、显示今夕何年何月、判断闰年还是平年)
- 《在路上 …》 42区介绍演讲- 在家的排练的MP3
- Android APP 奔溃 ,如何在开发者选项观察错误日志
- 金融反欺诈-交易基础介绍 - 阿里巴巴云誉【转载】
- 电子脑PHP动画制作,gif动图用什么软件制作
- GTD--时间管理机制
- 矩阵的平移缩放和旋转
- 【论文】AMC:AutoML用于移动设备上的模型压缩和加速
- 莪 、不 � 是 偷 偷 想 � 了 .
- 开普敦知名景点突发大火 超过20辆消防车参与救援