友元成员函数怎么用?

news2024/9/29 19:19:57

        友元破坏了类的封装性,能够让友元的类或函数访问到类的私有数据,既然它有这个特性那就看看怎么使用吧,这里看个友元成员函数的使用。

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class CDate;
class CTime
{
public:
	void showDate(CDate &date)
	{
		printf("%d-%d-%d \n", date.mYear, date.mMonth, date.mDay);
	}
};

class CDate
{
	friend void CTime::showDate(CDate &date);
public:
	CDate(int y, int m, int d): mYear(y), mMonth(m), mDay(d)
	{
		
	}
private:
	int mYear;
	int mMonth;
	int mDay;
};

int main()
{
	CDate date(2024, 8, 30);
	CTime time;
	time.showDate(date);
	
	return 0;
}

看这个代码的意图是想在类 CTime j里通过传进来的 CDate 对象直接访问CDate的私有数据,没有友元的情况下,是无法直接访问类的私有数据的。但这样使用最直接的错误就是找不到 CDate的定义,编译错误如下 :

 

有人会说不是有个前置声明吗?然而这个 class CDate; 前置声明对声明这个类型的指针是有效的,因为指针的大小是固定的(4字节或8字节),不管定义什么类型的指针其大小都是固定的,它不关心指针指向的具体的数据类型。但非指针定义就需要知道这个类型的具体结构,因为为分配相应的内存大小。以下改成指针类型的,但也不能访问数据,只是能编译成功而已:
 

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class CDate;
class CTime
{
public:
	void showDate(CDate *date)
	{
		//printf("%d-%d-%d \n", date.mYear, date.mMonth, date.mDay);
	}
};

class CDate
{
	friend void CTime::showDate(CDate *date);
public:
	CDate(int y, int m, int d): mYear(y), mMonth(m), mDay(d)
	{
		
	}
private:
	int mYear;
	int mMonth;
	int mDay;
};

int main()
{
	CDate date(2024, 8, 30);
	CTime time;
	time.showDate(&date);
	
	return 0;
}

那怎么解决上面的问题呢?那就是那个友元成员函数只在类里声明,在类外定义即可。如:

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class CDate;
class CTime
{
public:
	void showDate(CDate &date);
};

class CDate
{
	friend void CTime::showDate(CDate &date);
public:
	CDate(int y, int m, int d): mYear(y), mMonth(m), mDay(d)
	{
		
	}
private:
	int mYear;
	int mMonth;
	int mDay;
};

void CTime::showDate(CDate &date)
{
	printf("%d-%d-%d \n", date.mYear, date.mMonth, date.mDay);
}

int main()
{
	CDate date(2024, 8, 30);
	CTime time;
	time.showDate(date);
	
	return 0;
}

 编译器毕竟是从上到下进行编译,到编译 void CTime::showDate(CDate &date) 时,已经有了 CDate 的定义了,所以编译器知道这个 CDate 的大小及数据结构。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

脑电图(学习自用)(1-4课)

文章目录 第一课&#xff1a;电极的安放位置和测量安放前的准备放置操作导联设置 第二课&#xff1a;脑电图一般判读原则判断正常的脑电图睡眠期的脑电图正常成分慢波的说明 正常脑电图的变异弥漫性慢波 第三课&#xff1a;脑电图波的分析和识别波幅的分布 位相波形-单型波正弦…

C#预处理器指令

预处理器指令(Preprocessor Directives)指导编译器在实际编译开始之前对信息进行预处理. 通过这些指令,可以控制编译器如何编译文件或编译哪些部分.常见的预处理器指令包括条件编译,宏定义等. 所有的预处理器指令都是以#开始,且在一行上,只有空白字符可以出现在预处理器指令之…

领夹麦克风哪种好,领夹麦克风哪种好用又实惠,无线麦克风推荐

​对于追求高品质视频内容的创作者来说&#xff0c;优质的录音设备是不可或缺的。今天&#xff0c;我将分享几款性价比极高的无线领夹麦克风&#xff0c;它们将帮助你在各种拍摄环境中获得清晰、专业的音频&#xff0c;让你的作品声音部分无可挑剔吧&#xff01; 一、无线领夹麦…

网易易盾携手雷斧科技,打造公平竞技环境

这是一个充满复古像素风格的游戏世界&#xff0c;玩家们控制着自己的像素角色&#xff0c;手持着各种像素化武器&#xff0c;时而酣畅对战&#xff0c;时而自由创作地图、武器和皮肤。 《像素射击》是由雷斧科技开发的一款集生存、对战、沙盒创造于一体的像素风格的3D多人在线…

Kafka【四】Controller的选举机制

【1】控制器&#xff1a;Controller Kafka是分布式消息传输系统&#xff0c;所以存在多个Broker服务节点&#xff0c;但是它的软件架构采用的是分布式系统中比较常见的主从&#xff08;Master - Slave&#xff09;架构&#xff0c;也就是说需要从多个Broker中找到一个用于管理…

安卓项目打包与发版说明-笔记

项目打包与发版说明 Android Studio 打包 1.打包debug版 在调试完成后&#xff0c;点击编辑器的上方Build选项&#xff0c;然后依次选择 ->Build Bundle(s) / APK(s) -> Build APK(s) 打包完成后在控制台信息处点击信息框中的locate&#xff0c;在文件管理器中浏览&a…

Linux_kernel简介01

--------------------------------------------------------- 力扣专题 --------------------------------------------------------- 一、嵌入式开发 1、ARM的历史 ARM原本含义(Acom RISC Machine)后来Acron公司独立出了ARM部门&#xff0c;成立了ARM公司&#xff08;Advan…

指挥中心操作台在应急响应中的关键作用

在现代社会&#xff0c;面对突如其来的自然灾害、公共卫生事件或安全事故等紧急状况&#xff0c;高效、迅速的应急响应机制是保障社会稳定与人民安全的重要基石。而在这场与时间赛跑的较量中&#xff0c;指挥中心操作台无疑扮演着至关重要的角色&#xff0c;它是应急管理体系中…

源代码加密软件有哪些?11款超好用的源代码加密软件推荐

在软件开发领域&#xff0c;源代码加密是保护企业知识产权和核心技术的重要手段。随着远程办公和云开发的普及&#xff0c;源代码在传输和存储过程中面临的安全风险日益增加。因此&#xff0c;选择合适的源代码加密软件至关重要。以下是11款超好用的源代码加密软件推荐&#xf…

Python画笔案例-020 绘制米字图

1、绘制米字图 通过 python 的turtle 库绘制一个米字图的图案&#xff0c;如下图&#xff1a; 2、实现代码 绘制一个米字图&#xff0c;以下为实现代码&#xff1a; """米字图.py """ import turtle # 导入海龟模块turtle.pensize(2…

RocketMQ安装实操

官方下载地址 http://rocketmq.apache.org/dowloading/releases/ 使用最新的版本。 1.2、环境要求 Linux64位系统JDK1.8(64位)源码安装需要安装Maven 3.2.x1.3、目录介绍 bin:启动脚本,包括shell脚本和CMD脚本conf:实例配置文件 ,包括broker配置文件、logback配置文件等l…

Python编程实战营:四款实用小项目助你快速入门,从零开始打造你的个人项目集!

踏入编程世界的门槛&#xff0c;总是伴随着既兴奋又忐忑的心情。作为Python的新手&#xff0c;你是否渴望通过实际项目来巩固知识、提升技能&#xff1f;本篇文章将引领你踏上一段从理论到实践的精彩旅程&#xff0c;通过四个精心设计的项目&#xff0c;让你在趣味与挑战中快速…

机器人大会引领产业动向,卓翼飞思绘制无人系统教科研新蓝图

8月21日&#xff0c;万众瞩目的2024世界机器人大会暨博览会在北京亦创国际会展中心盛大开幕。这场为期5天&#xff0c;集“展览”“论坛”“赛事”于一体的机器人盛会&#xff0c;反映了当下机器人领域的繁荣生态。据官方统计数据&#xff0c;今年现场逛展观众高达25万人次&…

划分聚类方法实现与应用

文章目录 划分聚类介绍K-Means 聚类方法用python实现聚类生成示例数据随机初始化中心点计算样本与中心点的距离更新聚类中心K-Means 聚类算法实现用scikit-learn实现聚类如何确定k肘部法则K-Means++ 聚类算法生成数组K-Means 聚类K-Means++ 算法流程K-Means++ 算法实现Mini-Bat…

【AI绘画】Midjourney前置指令/describe、/shorten详解

文章目录 &#x1f4af;前言&#x1f4af;Midjourney前置指令/describe使用方法1️⃣2️⃣3️⃣4️⃣&#xff08;选择对应提示词&#xff09;&#x1f504;&#xff08;重新识别生成提示词&#xff09;&#x1f389;Imagine all&#xff08;一次性生成所有&#xff09;注意 &a…

【项目文档】软件实施方案(软件文档Word原件)

一、 概述 二、 项目介绍 2.1 概览 三、 项目实施 3.1 项目实施概况 3.2 项目实施管理原则 3.3 项目组织结构 3.4 项目团队 四、 项目实施计划 4.1 项目实施工作流程 4.2 项目软件部分进度安排 4.3 网络拓扑图 4.4 服务器需求清单 五、 人员培训 5.1 培训内容 5…

如何快速创建美观实用的思维导图?五个技巧教你轻松上手

在信息爆炸的时代&#xff0c;如何高效地整理和记忆海量信息&#xff0c;成为许多人关注的焦点。思维导图作为一种创新的笔记记录方式&#xff0c;因其直观、结构化的特性&#xff0c;逐渐成为现代学习和工作的首选工具。许多学习高手和职场精英都纷纷青睐这一方法&#xff0c;…

【TiDB原理与实战详解】4、DM 迁移和TiCDC数据同步~学不会? 不存在的!

DM工具数据迁移 1、简介 DM全称TiDB Data Migration , 支持兼容mysql协议的数据库&#xff08;MySQL、MariaDB、Aurora MySQL&#xff09;&#xff0c;将数据&#xff08;异步&#xff09;迁移到TiDB中。支持全量和增量数据传输。可以过滤数据&#xff0c;可以将分库分表的数据…

【JVM原理】类加载机制

文章目录 一、JVM组成二、类的生命周期2-1 加载 (Loading)2-2 连接 (Linking)2-3 初始化 (Initialization)2-4 使用 (Using)2-5 卸载 (Unloading) 三、类加载器3-1 类加载器的作用3-2 类加载器的种类3-3 类加载机制双亲委派机制&#xff08;Parent Delegation Model&#xff09…

分享林曦老师的苏东坡入门阅读清单

大家暑假过得还愉快嘛假期前暄桐的课程刚好进行到六阶“见道明心的笔墨”书法部分《赤壁赋》的学习&#xff0c;也为暑假提供些新的乐趣&#xff0c;林曦老师十分贴心地送给大家一份苏东坡阅读入门清单&#xff0c;每本书有不同的侧重点。祝大家读书开心&#xff0c;有满满的收…