友元 C++进修之路系列

本文详细介绍了C++中的友元概念,包括友元函数、友元类和友元成员函数,以及它们如何访问私有成员、用于操作符重载和可能带来的封装性破坏与维护挑战。

1.定义

        友元(Friend)是C++中一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。友元在一些特殊情况下非常有用,但也应谨慎使用,因为它会打破封装性和数据隐藏原则。

        当一个类或函数被声明为另一个类的友元时,它就能够绕过访问权限进行访问,即使这些成员在普通情况下对外是不可见的。友元的作用类似于家庭中的密友,可以借助其特殊身份获得其他成员私有信息的访问权。然而,友元并不是简单的双向关系,即A类是B类的友元,B类也是A类的友元,这种关系并不成立。友元有三种:友元函数、友元类、友元成员函数

2.友元函数

class ClassA
{
public:
	ClassA() { private_data = 5; };
private:
	int private_data;
	friend void FriendFunction(ClassA& class_a);
};

void FriendFunction(ClassA& class_a)
{
	printf("%d\n", class_a.private_data);
}

int main(int argc, char* argv[])
{
	ClassA class_a;
	FriendFunction(class_a);
}

        FriendFunction是ClassA的友元函数,因此FriendFunction可以直接访问ClassA的私有成员。

3.友元类

class ClassB;
class ClassA
{
public:
	ClassA() { private_data = 5; };
private:
	int private_data;
	friend class ClassB;
};

class ClassB
{
public:
	void GetClassAPrivate(ClassA& class_a)
	{
		printf("%d\n", class_a.private_data);
	};
};
int main(int argc, char* argv[])
{
	ClassA class_a;
	ClassB class_b;
	class_b.GetClassAPrivate(class_a);
}

        主要语法:friend class FriendClass;

        ClassB是ClassA的友元类,因此ClassB可以直接访问ClassA的私有成员

4.友元成员函数

class ClassA;
class ClassB
{
public:
	void GetClassAPrivate(ClassA& class_a);
};

class ClassA
{
public:
	ClassA() { private_data = 5; };
	friend void ClassB::GetClassAPrivate(ClassA& class_a);

private:
	int private_data;
};

void ClassB::GetClassAPrivate(ClassA& class_a)
{
	printf("%d\n", class_a.private_data);
};

int main(int argc, char* argv[])
{
	ClassA class_a;
	ClassB class_b;
	class_b.GetClassAPrivate(class_a);
}

注意:友元成员函数,应该这么理解ClassB的成员函数是ClassA的友元成员函数,意思是成员函数是ClassB不是ClassA的不要弄混了。由于需要把ClassB的某个成员函数定义为ClassA的友元成员函数,因此ClassB的类定义要放在ClassA之前,不然的话ClassA不知道ClassB有哪些成员函数。

5.使用场景

  1. 访问私有成员:主要作用是允许外部函数或类访问另一个类的私有成员,从而实现对类的细粒度控制。
  2. 操作符重载:当需要重载类的操作符(如<<、>>、+、-等)时,友元函数可以访问私有成员,实现合适的操作。
  3. 提高效率:在某些情况下,使用友元函数可以提高程序的执行效率,因为它可以直接访问类的私有成员,而不需要通过访问器函数(getter和setter)。

6.缺点

  1. 破坏封装性:友元函数可以突破类的封装性,使得类的私有成员可以被外部函数直接访问,可能会降低代码的安全性和可维护性。(友元也破环了类的隐藏与封装,所以必须慎用 (牺牲安全,提高效率))
  2. 难以维护:当程序变得复杂时,友元函数的使用可能会导致代码变得难以理解和维护。

注:友元不能 继承,交换,传递!

7.引用

C++友元详解_c++中的友元-优快云博客

C++——友元(友元函数、友元类和友元成员函数详解)_小羊Linux客栈的博客-优快云博客

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值