实验内容

(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】相关推荐

  1. java 枚举类组合在一起_Java,.NET,但为什么在一起?

    java 枚举类组合在一起 十二年前,Sun微系统公司大张旗鼓地宣布了一种新的编程语言和环境,用于使网页更具动态性和"活力". 当然,现在,Java编程语言是一种无处不在的工具,它 ...

  2. 数控编程方法可以分为两类:一类是手工编程,另一类是自动编程

    数控加工工作过程:如下图所示,在数控机床上加工零件时,要预先根据零件加工图样的要求确定零件加工的工艺过程.工艺参数和走刀运动数据,然后编制加工程序,传输给数控系统,在事先存入数控装置内部的控制软件支持 ...

  3. 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个60 ...

  4. c语言面向对象编程中的类_C ++中的面向对象编程

    c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...

  5. 类的练习2——python编程从入门到实践

    9-7 管理员: 管理员是一种特殊的用户.编写一个名为Admin的类,并让它继承练习9-3或者9-5的User类.添加一个名为privileges的属性,用于存储一个由字符串(如"can a ...

  6. python 类组合_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  7. python 字符串变量 组合列表_Python智慧编程——第3讲 字符串与列表

    第 3 课 Python 的字符串与列表 前面的课程中,我们通过Mu软件编程工具让Python做了一些基本的运算,并且学习了变量的概念以及使用.在这一课程里,我们会继续学习Python编程中的另一些内 ...

  8. Java黑皮书课后题第11章:11.3(Account类的子类)在编程练习题9.7中定义了一个Account类来对一个银行账户建模。一个账户有账号、余额、年利率、开户日期等属性,以及存款和取款等方法

    续标题:创建支票账户checking account和储蓄账户saving account两个子类.支票账户有一个透支限定额,但储蓄账户不能透支 题目(续) 题目中提到的编程练习题9.7:以下代码直接 ...

  9. java编程一般类抽象类的定义,Java编程基础抽象类

    本文主要是讲述Java编程基础-抽象类,更多Java技术知识,请登陆疯狂软件教育官网. 抽象类: 抽象:不具体,看不明白关键字abstract 抽象类的特点: 1.抽象方法只能定义在抽象类中,抽象类和 ...

最新文章

  1. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
  2. html:(35):缩进和行高
  3. c语言链表集合求并集用字母表示,c语言实现的链表集合的并集与交集
  4. 在eclipse中配置server和database
  5. BizTalk 2002:Registering Custom Components
  6. mysql 一台电脑多个服务_怎么在一台windows主机上安装多个mysql服务
  7. 通达信l2接口公式代码怎么获取excel数据?
  8. 2019下半年计算机二级c语言,2019年下半年计算机二级C语言试题(4)
  9. [导入]运筹帷幄之中,决胜千里之外(搜索世界的监视器为你所用)
  10. 银行金融计算机考试成绩查询系统,速看!人民银行成绩出了!戳进查分数+看排名!...
  11. Mac安装redis并设置开机自启动
  12. Autojs-QQ每日定时给女票/男票/闺蜜/基友发送一句话
  13. Python如何删除多余的空格与空行(有代码)
  14. 数组下标越界异常是如何产生的
  15. 不得不看的经典软件测试面试问题
  16. 服务器 无线 有线,【干货】有线无线一体化移动网
  17. 创业公司融资,股权是如何一步步被稀释的?
  18. 《Python从入门到实践》读书笔记——第五章 if语句
  19. 微信小程序组件化开发框架wepy 学习(二)
  20. 一年时间,拿到了人生中的第一个10万

热门文章

  1. javaSE (十七)Date、SimpleDateFormat、Calendar类的方法(计算在这个世界上生活多少天、显示今夕何年何月、判断闰年还是平年)
  2. 《在路上 …》 42区介绍演讲- 在家的排练的MP3
  3. Android APP 奔溃 ,如何在开发者选项观察错误日志
  4. 金融反欺诈-交易基础介绍 - 阿里巴巴云誉【转载】
  5. 电子脑PHP动画制作,gif动图用什么软件制作
  6. GTD--时间管理机制
  7. 矩阵的平移缩放和旋转
  8. 【论文】AMC:AutoML用于移动设备上的模型压缩和加速
  9. 莪 、不 � 是 偷 偷 想 � 了 .
  10. 开普敦知名景点突发大火 超过20辆消防车参与救援