有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期和时间

        可以使用友元成员函数。在本例中除了介绍有关友元成员函数的简单应用外,还将用到类的提前引用声明,请读者注意。
编写程序:

运行结果:

程序分析:
        在一般情况下,两个不同的类是互不相干的。display函数是Time类中的成员函数,它本来只可以用来输出Time类对象中的数据成员hour,minute,sec。现在在Date类中把它声明为"朋友",因此也可以访问Date类对象中的数据成员mouth,day,year。所以在display函数中既可以输出Time类的时、分、秒,又可以输出其"朋友"类的对象中的年、月、日。注意,在输出本类对象的时、分、秒时,不必使用对象名,而在输出Date类的对象中的年、月、日时,就必须加上对象名(如d.month)。如果不用友元函数,为了实现题目要求,就要在两个类中分别包括两个输出函数(如display1,display2),在主函数中分别调用这两个函数,先后输出日期和时间。显然用友元函数方便。
        请注意在本程序中调用友元函数访问有关类的私有数据方法:
        (1)在函数名display的前面要加display所在的对象名(如t1)。
        (2)display 成员函数的实参是Date类对象d1,否则就不能访问对象d1中的私有数据。
        (3)在Time::display函数中引用Date类私有数据时必须加上对象名,如d.month。

注意:在本例中声明了两个类Time和Date。程序第3行是对Date类的声明,因为在第7行和第16行中对display函数的声明和定义中要用到类名Date,而对Data类的定义却在其后面。能否将Date类的声明提到前面来呢?也不行,因为在 Date类中第 4行又用到了Time类,也要求先声明Time类才能使用它。这就形成了"连环套",类似于"鸡生蛋,蛋生鸡"的问题。为了解决这个问题,C++允许对类进行"提前引用"的声明,即在正式声明一个类之前,先声明一个类名,表示此类将在稍后声明。程序第3行就是提前引用声明,它只包含类名,不包括类体。如果没有第3行,程序编译就会出错。有了第3行,在编译时,编译系统会从中得知 Date是一个类名,此类将在稍后定义。
        有关对象提前引用的知识:在一般情况下,对象必须先声明,然后才能使用它。但是在特殊情况下(如本例所示的这样),在正式声明类之前,需要使用该类名。但是应当注意:类的提前声明的使用范围是有限的。只有在正式声明一个类以后才能用它去定义类对象。如果在上面程序第3行后面增加一行:
        Date d1;        //试图定义一个对象
会在编译时出错。因为在定义对象时是要为这些对象分配存储空间的,在正式声明类之前,编译系统无法确定应为对象分配多大的空间。编译系统只有在"见到"类体后,才能确定应该为对象预留多大的空间。在对一个类做了提前引用声明后,可以用该类的名字去定义指向该类型对象的指针变量或对象的引用(如在本例中,display的形参是Date类对象的引用)。这是因为指针变量和引用与它所指向的类对象的大小无关。
        请注意程序是在定义Time::display函数之前正式声明Date类的。如果将对Date类的声明的位置(程序第13~21行)改到定义Time::display函数之后,编译就会出错,因为在Time::display函数体中要用到Date类的成员month,day,year。如果不事先声明Date类,编译系统无法识别成员 month,day,year等成员。读者可以上机调试一下。
        说明: 一个函数( 包据普通函数和成员函数)可以被多个类声明为"朋友",这样就可以引用多个类中的私有数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/781525.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为云OBS 通过S3客户端访问

华为云好像没有对S3协议的支持说明其实底层是支持S3协议的。 使用S3的时候我们会需要endpoint,桶名字,region,AWS_ACCESS_KEY,AWS_SECRET_KEY 其中endpoint 就是图片中的,桶名字也很容易找到,region 就是你的endpoint…

Nestjs基础

一、创建项目 1、创建 安装 Nest CLI(只需要安装一次) npm i -g nestjs/cli 进入要创建项目的目录,使用 Nest CLI 创建项目 nest new 项目名 运行项目 npm run start 开发环境下运行,自动刷新服务 npm run start:dev 2、…

Maven一键配置阿里云远程仓库,让你的项目依赖飞起来!

文章目录 引言一、为什么选择阿里云Maven仓库?二、如何设置Maven阿里云远程仓库?三、使用阿里云Maven仓库的注意事项总结 引言 在软件开发的世界里,Maven无疑是一个强大的项目管理工具,它能够帮助我们自动化构建、依赖管理和项目…

C++初学者指南-5.标准库(第一部分)--迭代器

C初学者指南-5.标准库(第一部分)–迭代器 Iterators 文章目录 C初学者指南-5.标准库(第一部分)--迭代器 Iterators1.默认正向迭代器2.反向迭代器3.基于迭代器的循环4.示例:交换相邻的一对元素5.迭代器范围6.迭代器范围中的元素数量7. 总结:迭代器 指向某…

动态规划|剑指 Offer II 093. 最长斐波那契数列

如果数组 arr 中存在三个下标 i、j、k 满足 arr[i]>arr[j]>arr[k] 且 arr[k]arr[j]arr[i],则 arr[k]、arr[j] 和 arr[i] 三个元素组成一个斐波那契式子序列。由于数组 arr 严格递增,因此 arr[i]>arr[j]>arr[k] 等价于 i>j>k。 把这道题…

记录第一次使用air热更新golang项目

下载 go install github.com/cosmtrek/airlatest 下载时提示: module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此时,需要在go.mod中加上这么一句: replace github.com/cosmtrek/air &…

jmeter-beanshell学习4-beanshell截取字符串

再写个简单点的东西,截取字符串,参数化文件统一用csv,然后还要用excel打开,如果是数字很容易格式就乱了。有同事是用双引号把数字引起来,报文里就不用加引号了,但是这样beanshell处理起来,好像容…

插入排序——C语言

假设我们现在有一个数组,对它进行排序,插入排序的算法如同它的名字一样,就是将元素一个一个插入到合适的位置,那么,该如何做呢? 如果我们要从小到大进行排序的话,步骤如下: 1.对于…

LabVIEW机器视觉系统中的图像畸变、校准和矫正

在机器视觉应用中,图像畸变、校准和矫正是确保图像准确性的关键步骤。LabVIEW作为一种强大的图像处理和分析工具,提供了一系列功能来处理这些问题。以下是对图像畸变、校准和矫正的详细介绍。 图像畸变 图像畸变 是指由于摄像镜头的光学特性或拍摄角度问…

二分法查找有序表的通用算法(可查链表,数组,字符串...等等)

find_binary函数 注意事项: (1)你设计的迭代器模板中必须有using value_type T,且有加减运算功能,其本上能与C标准库std中一样。 (2)集合必须是有序的。 下面是函数代码: /// &…

土豆炒肉做法

菜单:土豆、葱、铁辣子、纯瘦肉、淀粉、生抽、酱油、刀、案板、十三香、盐巴、擦板 流程: 洗土豆,削皮,擦成条,用凉水过滤两遍淀粉,顺便放个燥里洗肉,切成条,按照生抽、酱油、淀粉、…

react dangerouslySetInnerHTML将html字符串以变量方式插入页面,点击后出现编辑状态

1.插入变量 出现以下编辑状态 2.解决 给展示富文本的标签添加css样式 pointerEvents: none

JAVA之(方法的重载与重写、this关键字、super关键字)

方法的重载与重写 一、方法的重载与重写1、回顾方法的定义2、重载的概念3、重写 二、this关键字1、何为this方法2、使用方法(1)在构造方法中指构造器所创建的新对象(2) 方法中指调用该方法的对象(3) 在类本…

【植物大战僵尸杂交版】获取+存档插件

文章目录 一、还记得《植物大战僵尸》吗?二、在哪下载,怎么安装?三、杂交版如何进行存档功能概述 一、还记得《植物大战僵尸》吗? 最近,一款曾经在15年前风靡一时的经典游戏《植物大战僵尸》似乎迎来了它的"文艺复…

自用款 复制粘贴工具 Paste macOS电脑适配

Paste是一款专为Mac和iOS用户设计的剪贴板管理工具,它提供了强大的剪贴板增强功能。Paste能够实时记录用户复制和剪切的内容,包括文本、图片、链接等多种数据类型,并形成一个可视化的剪贴板历史记录,方便用户随时访问和检索。此外…

嵌入式鸿蒙系统openharmony编译方法详解

大家好,时光如梭,今天主要给大家分享一下,鸿蒙系统的使用方法,以及源码该如何编译,其中要注意的细节有哪些? 第一:OpenHarmony系统简介 OpenHarmony 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代,基于…

vite简介

vite是新一代前端构建工具,vite具有优势如下: 轻量快速的热重载(HMR),能实现快速的服务启动。对TypeScript、JSX、CSS等支持开箱即用。真正的按需编译,不再等待整个应用编译完成。webpack构建与vite构建对…

html+css+JavaScript 实现两个输入框的反转动画

开发时遇到了一个输入框交换的动画 做完之后觉得页面上加些许过渡或动画,其变化虽小,却能极大的提升页面质感,给人一种顺畅、丝滑的视觉体验。它的实现过程主要是通过css中的transition和animation来实现的。平时在开发的时候增加一些动画效…

PYTHON自学笔记(一)vscode配置

安装python 自行官网下载 安装vscode 自行官网下载 环境变量设置 把python和scripts的文件路径,添加到环境变量的path中,如图: 此项不弄,在命令行模式中系统不会认为你装了python和pip,你的输入相关命令shell不会…

Python实现ABC人工蜂群优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化…