【c++友元】

【c++友元】,第1张

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

C++ 友元


前言

提示:这里可以添加本文要记录的大概内容:

本人是一个大一萌新,之间有什么不足或bug欢迎各路大佬批评指正!!!也欢迎大家共同学习,共同进步!!!


提示:以下是本篇文章正文内容,下面案例可供参考

一、友元简介:

友元函数在类的作用域之外被定义,不是类的成员函数,但具有访问类的public private protected成员的成员权限.

二、友元函数声明的一般形式:
// friend <返回类型> <函数名> (<参数列表>);
// 在类定义中函数原型前加friend 就将函数声明为该类的友元.    
// 声明这个友元函数可以在类的任何地方,可以访问友元函数的所有成员,所有成员函数;
``
// 例如:
#include
using namespace std;
class MyClass
{
	public :
		MyClass(string name)
		{
			m_name = name;
		}
	friend void Display(MyClass &mycalss);   // 友元函数 
	protected:
	string m_name;	
};
void Display(MyClass &mycalss)
{
	cout << "Access Protected data : " << mycalss.m_name << endl;
}     // 此时访问了Myclass的protected变量 
int main()
{
	MyClass test("Class A");
	Display(test);
	return 0;
}


友元函数的使用:

1.一个普通函数可以是多个函数的友元:

#include
using namespace std;
class MyClass_B;

class MyClass_A
{
public :
	MyClass_A(string name)
	{
		m_name = name;
	}
	friend void Display(MyClass_A &myA,MyClass_B &myB);
private :
	string m_name;
};
class MyClass_B
{
public :
    MyClass_B(string name)
	{
	 	m_name = name;
	}	
	friend void Display(MyClass_A &myA,MyClass_B &myB);
private :
	string m_name;		 
};
void Display(MyClass_A &myA,MyClass_B &myB)
{
	cout << "MyClass A : " << myA.m_name << endl;
	cout << "MyClass B : " << myB.m_name << endl;
}
int main()
{
	MyClass_A testA("Class A");
	MyClass_B testB("Class B");
	Display(testA,testB);
	return 0;
}

2一个类的成员函数也可以是另一个类的友元:

#include
using namespace std;
class MyClass_B;
class MyClass_A
{
public :
	MyClass_A(string name)
	{
		m_name = name;
	}
	void Function(MyClass_B &myB);
private :
	string m_name;
}; 
class MyClass_B
{
public :
		MyClass_B(string name)
		{
			m_name = name; 
		}
	friend void MyClass_A::Function(MyClass_B &myB);
private :
    string m_name;
};
void MyClass_A::Function(MyClass_B &myB)
{
	cout << myB.m_name << endl;
 } 
int main()
{
	MyClass_A testA("Class A");
	MyClass_B testB("Class B");
	testA.Function(testB);
	return 0;
}

3.整个类也可以是另一个类的友元:

#include
using namespace std;
class MyClass_B;
class MyClass_A
{
public :
	MyClass_A(string name)
	{
		m_name = name;
	}
	friend class MyClass_B;
private :
	string m_name;
}; 
class MyClass_B
{
public :
		MyClass_B(string name)
		{
			m_name = name; 
		}
	void Display(MyClass_A &myA);
private :
    string m_name;
};
void MyClass_B::Display(MyClass_A &myA)
{
	cout << myA.m_name << endl;
	MyClass_A test("test");
	cout << test.m_name << endl;
 } 
int main()
{
	MyClass_A testA("Class A");
	MyClass_B testB("Class B");
	testB.Display(testA); 
	return 0;
}
总结:
  1. 即使frinend函数的原型出现在类定义内,友元仍不是成员函数.
  2. private、protected、public这些成员访问说明符标志与友元的声明无关,也就是说友元可以定义在类的任何地方.
  3. 友元关系是授予关系,而不是索取.也就是说,要使类B成为类A的友元,类A必须在类中显式的声明类B是它的友元.
  4. 友元既不对称也不传递: 类A是类B的友元,类B是类C的友元,不能说明类B是类A的友元,类C是类B的友元,类A是类C的友元.怎么理解呢? 咱们把ABC当成三个人,A说B是我的朋友,B说C是我的朋友,但是B不一定承认A是它的朋友,所以B可以访问A的成员,但A不能访问的成员,同理BC也是. A说B是我的朋友,B说C是我的朋友也不能说明A是C的朋友.
以上就是今天要讲的内容,如有什么不足欢迎大家批评改正!!!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1324270.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-12
下一篇2022-06-12

发表评论

登录后才能评论

评论列表(0条)

    保存