当前位置: 首页 > news >正文

定义多个类对象,分别输入和输出各对象中的时间(时:分:秒)

        在前面的文章中,类中只有公用数据而无成员函数,而且只有1个对象。可以直接在主函数中进行输入和输出。若有多个对象,需要分别引用多个对象中的数据成员,可以写出如下程序:
(1)编写程序(a):

        程序是清晰易懂的,但是在主函数中对不同的对象一一写出有关操作,会使程序冗长,如果有10个对象,那么主函数会有多长呢?这样会降低程序的清晰性,使阅读困难。为了解决这个问题,可以使用函数来进行输入和输出,见程序(b)。

(2)编写程序(b):

运行结果:

程序分析:
        函数set_time和show_time是普通函数,而不是成员函数。函数set_time用来给数据成员赋值,函数show_time用来显示数据成员的值。函数的形参t是Time类对象的引用t,当主函数调用函数
        set_time(t1);
时,由于set_time函数中的形参t是Time类对象的引用,因此它与实参1共占同一段内存单元(所以说t是t1的别名)。调用set_time(t1)相当于执行以下语句:
        cin>>t1.hour;
        cin>>t1.minute;
        cin>>t1.sec;
向t1中的hour,minute和sec输入数值。
        调用show_time(t1)时,输出对象t1中的数据。用t2作实参时情况类似。
注意:

        在程序中对类对象t1和t2的定义是分别用两个语句完成的,并未写在一行上。C语言要求所有的声明必须集中写在本模块的开头,因此熟悉C语言的程序编写人员往往养成一个习惯,把所有声明集中写在本模块的开头。但是在 C++编程中并不提倡这样做。在 C++中,声明是作为语句处理的,可以出现在程序中的任何行。因此,C++的编程人员习惯不把声明都写在开头,而是用到时才进行声明(如同本程序那样),这样程序比较清晰,阅读方便。

(3)编写程序(c):

        可以对上面的程序作些修改,数据成员的值不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数。

运行结果:

程序分析:
        在执行
        set_time(t1,12,23,34);
时,将12,23,34分别传递给形参hour,minute和sec,然后再赋予t.hour,t.minute,t.sec,由于t是t1的引用,因此相当于赋给t1.hour, t1.minute,t1.sec,即对象t1中的数据成员hour,minute和sec。因此在执行show_time(t1)时输出"12:23:34"。
        在执行下面语句
        set_time(t2);
时,由于只给出第1个参数t2,后面的3个参数未给定,因此形参采用定义函数时指定的默认值。
说明:

        在main函数中对set_time函数作原型声明时指定了默认参数,在定义set_time函数时不必重复指定默认参数。如果在定义函数时也指定默认参数,其值应与函数声明时一致,如果不一致,编译系统以函数声明时指定的默认参数值为准,在定义函数时指定的默认参数值不起作用。例如将定义 set_time函数的首行改为
        void set_time(Time&t, int hour=9, int minute=30,int sec=0)
        在编译时上行指定的默认参数值不起作用,运行结果仍为
        12:23:34
        0:0:0
        以上两个程序中定义的类都只有数据成员,没有成员函数,这显然没有体现出使用类的优越性。之所以举这两个例子,主要想从最简单的情况开始逐步熟悉有关类的使用。在之后的文章中,类体中就包含成员函数。

相关文章:

  • Vue82-组件内路由守卫
  • Sourcetree:Git版本控制的最佳伴侣
  • CGFloat转NSString保持原有的精度,末尾不添加0
  • 『大模型笔记』如何让小型语言模型发挥作用!
  • 【odoo】常用的基本视图类型
  • 互联网的盈利模式
  • Kotlin基础——Typeclass
  • three.js 第八节 - gltf加载器、解码器
  • Linux_内核缓冲区
  • 高斯算法的原理及其与常规求和方法的区别
  • 计算机系统基础实训七-MallocLab实验
  • vmware虚拟机安装ubuntu20.04
  • 9、Spring之Bean生命周期~依赖注入(总)
  • python入门基础知识(错误和异常)
  • 兴顺物流管理系统的设计
  • ES6指北【2】—— 箭头函数
  • #Java异常处理
  • 【Leetcode】104. 二叉树的最大深度
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • iOS 颜色设置看我就够了
  • javascript 总结(常用工具类的封装)
  • PAT A1120
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Vim 折腾记
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 编写符合Python风格的对象
  • 从伪并行的 Python 多线程说起
  • 动态规划入门(以爬楼梯为例)
  • 翻译--Thinking in React
  • 讲清楚之javascript作用域
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 力扣(LeetCode)357
  • 学习ES6 变量的解构赋值
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (16)Reactor的测试——响应式Spring的道法术器
  • (5)STL算法之复制
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (solr系列:一)使用tomcat部署solr服务
  • (二) 初入MySQL 【数据库管理】
  • (南京观海微电子)——COF介绍
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (一)80c52学习之旅-起始篇
  • (一)kafka实战——kafka源码编译启动
  • (转)详解PHP处理密码的几种方式
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net 怎么循环得到数组里的值_关于js数组
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc