C++ 友元

举报
糖果罐子 发表于 2023/08/31 09:08:51 2023/08/31
【摘要】 @TOC 前言在C++编程中,友元(friend)是一种特殊的关系,允许一个类或函数访问另一个类中的私有成员。 一、什么是友元1.友元 的定义:友元在C++中可以被用于类和函数。对于类来说,可以创建一个友元类或友元函数。友元类可以 直接访问其它类的私有成员 ,而友元函数可以访问某一个类的私有成员。2.友元 的声明:在类定义中,可以使用 friend 关键字声明一个类或函数为友元。声明通常放在...

@TOC

前言

在C++编程中,友元(friend)是一种特殊的关系,允许一个类或函数访问另一个类中的私有成员。


一、什么是友元

1.友元 的定义:

友元在C++中可以被用于类和函数。对于类来说,可以创建一个友元类或友元函数。友元类可以 直接访问其它类的私有成员 ,而友元函数可以访问某一个类的私有成员。

2.友元 的声明:

在类定义中,可以使用 friend 关键字声明一个类或函数为友元。声明通常放在类的访问说明符(public、private、protected)之间。

==友元 关系发生在函数与类之间 或者 类与类 之间。==

class MyClass {
private:
  int privateData;
public:
  friend class FriendClass; // 友元类声明
  friend void FriendFunction(); // 友元函数声明
};

二、友元的特性

1.局限性

友元的使用应该谨慎,并且遵循信息隐藏的原则。友元的目的是提供更灵活的访问权限,但也可能破坏封装性和安全性。应该尽量避免滥用友元,只在必要的情况下使用。

2.友元 关系的传递性

友元 关系不能传递,友元 关系 是单向的。 即使一个类 A 是类 B 的友元,类 B 的友元类不会自动成为类 A 的友元。
如果 A 是 B 的友元, B 是 C 的友元,则 C 不是 A 的友元,不可以传递使用。
在这里插入图片描述

三、示例代码

  1. 示例一:
    友元函数允许函数访问类中的私有成员。被声明为友元的函数可以直接访问友元类的私有成员。
class Point
{
	int a, b;						// a,b 是类的私有成员
public:
	Point(int a, int b)
	{
		this->a = a;
		this->b = b;
	}

	friend void fun(Point&p);			//声明 友元 函数
};

void fun(Point& p)
{
	printf("a = %d, b = %d\n",p.a,p.b);			//在 fun 函数内可直接访问 类的私有成员
}

int main(void)
{
	Point p(1,2);
	fun(p);
	return 0;
}

在这里插入图片描述

  1. 示例 二
    友元类允许一个类访问另一个类中的私有成员。被声明为友元的类可以直接访问友元类的私有成员。
class name1
{
	const char* n;
public:
	name1(const char* n)
	{
		this->n = n;
	}
	friend class name2;				// 声明 友元 类
};

class name2
{
public:
	void GetName1(name1& name)				// 打印 name1 类的名字
	{
		printf("name1 ==> %s\n", name.n);		// 访问 私有成员
	}
};

int main(void)
{
	name1 n1("hello");
	name2 n2;
	n2.GetName1(n1);

	return 0;
}

在这里插入图片描述


总结

友元是一个强大的特性,但应谨慎使用。正确理解和使用友元关系,可以在需要的时候提供更灵活的访问权限,同时保持良好的封装性和安全性。在设计类和函数时,考虑友元是否需要,并仔细评估其对程序结构的影响。
C++ 友元

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。