首页 > 其他分享 >定义多个类对象,分别输入和输出各对象中的时间(时:分:秒)

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

时间:2024-06-22 11:58:56浏览次数:19  
标签:set 函数 对象 程序 t1 minute time 输入 定义

        在前面的文章中,类中只有公用数据而无成员函数,而且只有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
        以上两个程序中定义的类都只有数据成员,没有成员函数,这显然没有体现出使用类的优越性。之所以举这两个例子,主要想从最简单的情况开始逐步熟悉有关类的使用。在之后的文章中,类体中就包含成员函数。

标签:set,函数,对象,程序,t1,minute,time,输入,定义
From: https://blog.csdn.net/2301_80138271/article/details/139866604

相关文章

  • 【C#进阶】高级面向对象特性_2024-06-22
    一、概念1.高级面向对象特性面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。这些对象可以包含数据和行为。高级面向对象特性包括:封装:把数据和操作这些数据的代码打包在一起,不让外部直接访问数据,而是通过方法来操作。继承:允许新创建的类(子类)继承现有类(父类)的属性和......
  • 在IdentityServer4生成的JWT中添加一个自定义的Claim,用于ABP框架中要用到的token信息
    用过IdentityServer4或者熟悉ASP.NETCore认证的都应该知道有Claim,如何理解ids4中的Claim?这里可以理解为声明,我们每个用户都有多个Claim,每个Claim声明了用户的某个信息比如:Role=Admin,UserID=1000等等,这里Role,UserID每个都是用户的Claim,都是表示用户信息的单元 ,我们不妨把它称为......
  • 对比Vue2/Vue3项目如何自定义插件
    学习目标:对比Vue2/Vue3项目如何自定义插件学习内容:插件(Plugins)是一种能为Vue添加全局功能的工具代码。一个插件可以是一个拥有 install() 方法的对象,也可以直接是一个安装函数本身。安装函数会接收到安装它的应用实例传递给Vue.use()/ app.use() 的额外选项作......
  • c++ 多重包含/定义 || 链接性 || 生命周期
     作用域&&生命周期C++中的作用域(scope)指的是变量、函数或其他标识符的可见和可访问的范围。生命周期(Lifetime)指的是变量或对象存在的时间段。它开始于变量或对象的创建(定义)时刻,结束于其被销毁的时刻。作用域:通过其声明的位置来确定。全局作用域:定义在(类/函数)外部......
  • java object多大 java对象内存模型 数组有多长(九)多线程2
    背景:多线程与单线程byte模式有误差,而且多线程每次跑出来不一样 发现:set多线程单线程没有误差,意味着除了byte那一块代码,其他的代码是可被信任的单线程5000以下byte没有hash冲突时==单线程set==apache==理论值;基本证明了这套cas在单线程下没问题;hash冲突是导致单线程set和单线......
  • Rocky Linux捣鼓记录(一):如何安装使用中文输入法
    linux的常见输入法方案有fcitx、ibus,fcitx类型的输入法我没找到合适方案,ibus提供了一个智能拼音中文输入法比较顺手,安装简单。我使用的系统版本为RockyLinux9.4,已经自带ibus中文输入法,从设置——keyboard中选择输入源,新增——汉语(中国)选择——中文(智能拼音)即可若系统中没有,......
  • 【Shell脚本】 Shell索引数组变量:定义-获取-拼接-删除、alisa内置命令、默认输出换行
    目录 Shell索引数组变量:定义-获取-拼接-删除 数组的获取 数组的拼接数组的删除 alisa内置命令默认输出换行语法 read内置命令 declare内置命令获取指定key的值使用declare定义一普通数组,并获取打印元素数据的值 expr命令 算术运算符 布尔运算符 逻辑......
  • SpringBoot+AOP+Redis自定义注解实现防重复提交
    1.哪些因素会引起重复提交?开发项目过程中可能会出现下面这些情况:前端下单按钮重复点击导致订单创建多次网速等原因造成页面卡顿,用户重复刷新提交请求黑客或恶意用户使用Postman等http工具重复恶意提交表单2.重复提交会带来哪些问题?重复提交带来的问题:会导致数据......
  • java面向对象三大特征
     免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动1.Java面向对象三大特征Java面向对象编程有三大特征:封装、继承、多态1.1封装封装(encapsulation)就是把抽象出的数据【属性】......
  • UE5笔记-实现Lumen实时渲染GI下的的类UCanvasRenderTarget实现多场景/自定义分辨率/方
    默认的SceneCapture不能用于实时Lumen光照模式下为了实现实时渲染GI下的的类似于UCanvasRenderTarget2D类.可以参考GameViewport类的源码尝试使用UE的渲染逻辑和数据多渲染一份视口副本到直接的FSceneView上,封装一份UCaptureRenderTarget出来从而实现一些例如自定义分辨率的......