前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++_友元函数与友元类

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

作者头像
木杉乀
发布2021-05-08 14:42:03
4990
发布2021-05-08 14:42:03
举报
文章被收录于专栏:木杉の小屋木杉の小屋

友元

1.知识点介绍

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

2.友元函数

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

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

用例:

代码语言:javascript
复制
#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类中的所有成员

代码语言:javascript
复制
// 示例
示例:
class A
{
  friend class B;
  int id;
}
class B
{
public:
void fun(A & a)
 {
    cout<<a.id<<endl;
 }

–>全面些的代码

代码语言:javascript
复制
#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没有关系
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 友元
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档