C++_友元函数与友元类

友元

1.知识点介绍

类的特性之一就是封装,而友元就是C++为用户提供打破这种封装的手段,友元分为友元函数和友元对象

2.友元函数

1、友元函数,他只是一个函数,友元函数不是类的成员,通过类对象是无法访问的,但是在这个函数中
有权通过访问类中的所有成员。
2、友元函数,无论声明在类中的任访问属性下都可以,不影响他的调用和访问

!!! 友元函数无论在类外定义, 还是在类内定义都不属于类

用例:

#include
using namespace std;
class CA {
     
	int num;					// 私有数据成员
	void fun();					// 私有函数成员
	friend void FFun(CA& a);	// 类外定义友元函数
	friend void FFun1(CA& a)	// 类中定义友元函数
	{
     
		a.fun();	//友元函数中调用普通函数
	}
};
void CA::fun()
{
     
	cout << "测试成功" << endl;
}
void FFun(CA& a)
{
     
	a.num = 15;
	cout << a.num << endl;
}
int main()
{
     
	CA a1;
	FFun(a1);		//结果: 15
	FFun1(a1);		//结果: 测试成功
	return 0;
}

3.友元类

友元类是一个单独的类,只不过和友元函数一样,在类中声明了一个友元类,在这个友元类中同样也
可以访问该类中的所有成员,在A类中声明B类为A类的友元类,那么在B类中就可以访问A类中的所有成员

// 示例
示例:
class A
{
     
  friend class B;
  int id;
}
class B
{
     
public:
void fun(A & a)
 {
     
    cout<<a.id<<endl;
 }

–>全面些的代码

#include
#include
using namespace std;
// CA是CTestClass的友元类

// CTestClass类
class CTestClass {
     
	int id;		//数据成员
	char* name;	//数据成员
	friend class CA;
public:
	CTestClass();					//构造
	~CTestClass();					//析构
	void setClassId(int i);			//公有函数成员
	void setClassName(char* n);		//公有函数成员
	void PrientClassId();			//公有函数成员
	void PrientClassName();			//公有函数成员
};
CTestClass::CTestClass()
{
     
	id = 0;
	name = nullptr;
}
CTestClass::~CTestClass()
{
     
	if (name)
		delete[] name;
	name = NULL;
}
void CTestClass::setClassId(int i)		// 功能: 给CTestClass类成员ID赋值
{
     
	id = i;
}
void CTestClass::setClassName(char* n)	// 功能: 给CTestClass类成员NAME赋值
{
     
	if (name)
		delete[] name;
	int len = strlen(n);
	name = new char[len + 1];
	strcpy(name, n);
}
void CTestClass::PrientClassId()		// 功能: 给CTestClass类成员ID打印
{
     
	cout << "ID: " << id << endl;
}
void CTestClass::PrientClassName()		// 功能: 给CTestClass类成员NAME打印
{
     
	cout << "NAMW: " << name << endl;
}
// CA类
class CA {
     
	// 使用系统默认构造析构
public:
	void fun(CTestClass& c); 			// CA中定义一个对CTestClass类操作的函数
};

void CA::fun(CTestClass& c)
{
     
	c.id = 10;
	if (c.name)
		delete[] c.name;
	c.name = new char[11];
	strcpy(c.name, "我是木杉乀");
}
int main()
{
     
	CA a;
	CTestClass Test;
	a.fun(Test);
	Test.PrientClassId();
	Test.PrientClassName();
	return 0;
}

4.友元的特性

  1. 单方向: A是B的朋友, A可以访问B的数据, B不可以访问A的数据
  2. 不传递: A是B的朋友, B是C的朋友, 但A和C没有关系
  3. 不继承: A是B的朋友, C是B的儿子, A和C没有关系

你可能感兴趣的:(c/c++,c++,编程语言,封装,面向对象编程)