C++之类对象的友元

机器人控制入门 机器人控制入门 对于工科领域来说,脱离实践的学习都是肤浅的,对于控制这种强调经验的技术更是如此。如果去问一个程序员怎么学习一块技术,他必然让你去多编程。机器人领域也是。如果想把基本功打扎实,那么实践更是必不可少了。 机器人控制有三个元素:控制器(算法),执行器(电机),传感器; 控制的本质就是将规划系统的指令作为输入信息,将传感器探测得到的状态信息和导航系统的定位 阅读详情

1.基本内容 

在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

友元函数 : 
       友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
       friend 类型 函数名(形式参数);
       友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
       一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
       友元函数的调用与一般函数的调用方式和原理一致。
友元类 : 
       友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。       
       当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
       friend class 类名;
       其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
例如,以下语句说明类B是类A的友元类:
       class A
       {
              …
       public:
              friend class B;
              …
       };
       经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

       使用友元类时注意:
             (1) 友元关系不能被继承。 
             (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
             (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的声明。

2.全局函数做友元

#include<iostream>
#include<string>
using namespace std;

class Student
{
	friend class Person;
private:
	int i;
};
class Person
{
	friend void fun();
	//Person(string &name, int &age) :this->name(name), this->age(age) 
	//本意是借助this指针完成形参和实参一致时构造函数的初始化列表
	//但是构造函数还没执行呢,你的对象还没创建出来呢,你都准备用this指针去创建,当然编译器无法识别
	//因此,构造函数初始化列表中不能用this
	Person(string  name1, int age1) : name(name1), age(age1)
	//不能在定义构造函数的时候使用引用形参,可以引用,但是把张三换成一个变量
	{
		num.i = 5;//如果不加第7行代码,根本别想访问i
	};
public:
	string name;
	Student num;
private:
	int age;
};


void fun()
{
	Person p1("张三",45);//必须要把void fun函数进入类 友元序列,否则,无法访问类中private;
}

int main() {

	
	fun();

	system("pause");

	return 0;
}

3.类做友元

    friend class 类名;

4.类中的成员函数做友元

#include<iostream>
#include<string>
using namespace std;

class Student;
class Teacher
{
public:
	Teacher();//构造函数和成员函数都要位于public下,不然默认是private就没法搞了!
	void get();

private:
	Student* stu;
};
class Student
{
	friend void Teacher::get();
public:
	Student();
	int stu_num;
private:
	string name;
};


Student::Student()
{
	stu_num = 5;
	name = "zhangsan";
}

Teacher::Teacher()
{
	stu = new Student;
}
void Teacher::get()
{
	cout << stu->stu_num << endl;
	cout << stu->name << endl;
}

void fun()
{
	Teacher t1;
	t1.get();
}


int main() {
	fun();
	system("pause");
	return 0;
}

//一点不注意根本都出不来啊,一定要注意friend的时候,类对象是否被创建,他其实是一个循环的过程,假设A为被访问隐私的类,B为要访问隐私的类

 下边是两种类程序的先后顺序

Sen+MK趋势分析 阅读详情

相关推荐

BRepNet与图神经网络融合:提升3D CAD加工特征识别的精度与泛化能力

本文探讨了BRepNet与图神经网络(GNN)融合技术如何显著提升3D CAD加工特征识别的精度与泛化能力。通过将CAD模型视为图结构,利用GNN的消息传递机制增强对复杂拓扑关系的理解,并结合BRepNet的局部特征提取,该融合方法在MFCAD++数据集上实现了高达99.53%的准确率,有效解决了传统方法在处理复杂相交特征时的局限性,为智能制造提供了关键技术支撑。

android的专栏 775

c++ :友元函数

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。 但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。 除了友元函数外,还有友元类,两者统称为友元。 友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间...

agnes9243的博客 144

深入探索前端调试神器vConsole

vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 8522

C++编程——友元

文章目录1. 友元的概念2. 友元的三种实现2.1 全局函数做友元2.2 类做友元2.3 成员函数做友元 1. 友元的概念 友元目的是让一个函数或者类访问另一个类中的私有成员。 有一个非常生动的例子,就是家中会有客厅和卧室,此时可以把家看成一个类。客厅是客人都可以进去的地方,可以理解为类内的公有成员;而对于卧室,客人其实是不能进去的,因为是你私密的空间,可以理解为类内的私有成员。但是呢,当一些特殊的客人,比如你的好朋友,亲人来到你家时,你是允许他们进入你的卧室的,这就好比一个类访问另外一个类中的私有成员

professor_tao的博客 1091

正点原子RK3588 Android 12镜像构建实战:从环境配置到烧录验证全指南

本文提供了一份基于正点原子RK3588开发板的Android 12镜像构建全流程实战指南。内容涵盖从Ubuntu环境配置、SDK获取、编译内核与系统,到最终镜像打包与烧录验证的完整步骤,并分享了内核驱动定制与系统优化技巧,旨在帮助开发者高效完成瑞芯微RK3588平台的系统定制工作。

grass的博客 811

deepfake detection数据集

最全Deepfake数据集总结,包含各个数据集下载链接: https://github.com/deepfakeinthewild/deepfake_in_the_wild Dataset name Download Generate method Deepfake videos Actors Deepfake-TIMIT low download De...

where_is_horse的博客 1万+

【C++】友元函数 ( 友元函数简介 | 友元函数声明 | 友元函数语法 | 友元函数声明不受访问控制限制 | 友元函数参数要求 )

一、友元函数简介 二、友元函数声明 1、友元函数语法 2、友元函数声明不受访问控制限制 3、友元函数参数要求 4、友元函数示例 三、完整代码示例 - 友元函数

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9681

FortiWeb 相对路径遍历漏洞复现(CVE-2025-64446)

FortiWeb是Fortinet公司推出的企业级Web应用防火墙(WAF),专为保护Web应用和API抵御高级威胁设计。它集成人工智能与机器学习技术,通过双层检测引擎(HMM模型与SVM向量机)精准识别异常流量,可防御OWASP Top 10攻击、SQL 注入、XSS、DDoS及恶意机器人。其核心功能包括API自动化保护、虚拟补丁集成(兼容Acunetix等第三方扫描工具)及智能流量分析,支持HTTP/2、WebSocket等现代协议。(CVE-2025-64446)

iSee857的博客 467

C++ 友缘关系

要求 人物 基类:class Lovers 子类:Boyfriend,Girlfriend 第三者:class Others 子类:(无) 故事是这样的 基类Lovers的name属性访问级别为protected,但将Others类设为友缘关系。 第三者Others类到自己拥有kiss方法,希望调用。此kiss方法传参为Boyfriend类型的的对象。 代码 #include&amp;amp;lt;ios...

寒泉 1146

基于深度学习YOLOv10的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

本文介绍了如何基于YOLOv10实现一个人脸表情识别系统。我们从数据集准备、模型训练到PySide6界面实现进行了详细的讲解。通过该系统,用户可以实时检测和分类人脸表情,为情感分析、智能交互等应用场景提供支持。

YOLO 1053

YOLOv13改进策略【Neck篇】| GSConv 轻量卷积,Slim-Neck 减参数还不掉点

Neck 篇的第二篇继续"替换式"改进,这次的对象是 Neck 里的下采样卷积。GSConv 出自《Slim-neck by GSConv: a better design of lightweight detector》(2022),它的出发点:DWSConv(深度可分离)轻但"信息混不进通道",标准卷积重但表达好——GSConv 用GConv(分组卷积)混通道 + DWConv 补空间 + Channel Shuffle 打散,两全其美。

qq_53329130的博客 30

C++友元类

友元类 不仅可以将一个函数声明为一个类的“朋友”,还可以将一个类(例如 B类)声明为另一个类(例如 A类)的“朋友”。这时B类就是A类的友元类。友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。 声明友元类的一般形式为: friend class 类名; 所以,可以在A类的定义体中,可以使用如下语句声明B类为其友元类: friend class B; 那么,类B是类A的友元类。所以,类B的成员函数就可以访问类A的私有成员。 ...

LC的专栏 7397

【AI智能体】Codex 开发聚合搜索应用项目实战操作详解

Codex 开发聚合搜索应用项目实战操作详解

congge 3096

《C++初阶之类和对象》【友元 + 内部类 + 匿名对象】

本文介绍了C++中的友元机制及其三种形式,匿名对象和内部类等C++特性,为后续内容做铺垫。文章通过代码示例详细演示了友元函数和友元类的使用方法,说明了如何通过friend关键字在类中声明友元关系。

序属秋秋秋的博客 1956

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++之类和对象:初始化列表,static成员,友元,const成员 ……

定义时不添加static关键字,类中只是声明3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问4.

m0_75122019的博客 1013

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C++之类和对象】初始化列表,C++11初始化新玩法,static成员,友元

这篇文章我们重点学习类和对象剩下的内容:初始化列表,C++11新玩法,友元,static成员。

胡坚涛的博客 1514

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++之类和对象(下)(再谈构造函数,C++11 的成员初始化新玩法,友元,static成员,内部类, 再次理解封装)

【本节目标】 ·1. 再谈构造函数 ·2.C++11 的成员初始化新玩法。 ·3. 友元 ·4. static成员 ·5. 内部类 ·6. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public: Date(int year, int month, int day) { _year = year; _month = month; _day = day;.....

weixin_56054625的博客 336

【C++入门基础】类和对象第二弹之类的认识并深入理解默认成员函数 (类和对象最全分享,默认成员函数、运算符重载、const成员及友元)

如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为**默认成员函数。** > 这六个默认成员函数,特殊点非常多,后面会一一学习,如果我们不实现,编译器会自己生成一份。

AMor_05的博客 263

【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

这篇文章探讨了C++中的几个重要概念:初始化列表、静态成员、友元和匿名对象,这篇文章涵盖了一些重要的C++概念,对于理解和应用这些概念有很大帮助。

Yawesh的博客 2831
上一篇: C++之类对象的常函数和常对象
下一篇: C++之运算符重载
Worthwhile_HUST
博客等级 码龄5年 53粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值