C++——友元(友元函数、友元类的特点)

目录

一、友元函数

1、定义

2、特点

3、对友元函数定义理解: 

4、对“友元是不能传递的”理解

 5、重载友元

一、友元函数

1、定义

  • (1)定义:友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元函数被视为好像是该类的一个成员。
  • 友元函数可以是常规的独立函数,也可以是其他类的成员。实际上,整个类都可以声明为另一个类的友元。
  • 为了使一个函数或类成为另一个类的友元,必须由授予它访问权限的类来声明。类保留了它们的朋友的 "名单",只有名字出现在列表中的外部函数或类才被授予访问权限。通过将关键字 friend 放置在函数的原型之前,即可将函数声明为友元。
  • 理解:让函数或者类作为另外一个类的朋友,则可以访问当前类的private或protected。
  • (2)格式:
  • friend 返回类型 函数名 (参数列表);
  • 例:friend void Add(A& a);

2、特点

  • (1)一个普通函数作为类的友元,那么在当前函数中就可以通过对象访问类的私有或者保护成员;
  • 注意:这个函数只能在外部定义,在当前类中引用即可。
  • (2)一个类的成员函数作为另外一个类的友元;
  • 注意:成员函数建议放在类外定义。
  • (3)一个类A作为另外一个类B的友元类,则A的所有成员函数就可以访问B的私有数据成员或保护成员;
  • 注意:
  •      ①友元是单向的;
  •      ②友元是不能进行传递的;
  •      ③友元是不能继承的。

3、对友元函数定义理解: 

class A {
public:
	A(int i=0):m_i(i){}
	int GetI()const
	{
		return m_i;
	}
protected:
	int m_j;
	friend void Add(A& a, A& b);//将Add函数作为类A的友元函数
private:
	int m_i;
};

//想在当前Add函数中访问私有数据成员,又不想通过接口(公有函数)
void Add(A& a, A& b)
{
	
	cout << a.m_i << endl;
	cout << b.m_i << endl;
	cout << a.m_i<<"+" <<b.m_i<<"="<< a.m_i + b.m_i << endl;
	//cout << a.GetI() + b.GetI() << endl;
}

int main()
{
	A a(5);
	A b(8);
	Add(a, b);

}

4、对“友元是不能传递的”理解

//BB是AA的朋友,CC是BB的朋友,如果CC没有作为AA的友元类,则CC和AA没有关系——友元就不能传递

//BB是AA的朋友,CC是BB的朋友,如果CC没有作为AA的友元类,则CC和AA没有关系——友元就不能传递
class BB;
class CC;
class AA
{
public:
	friend class BB;
private:
	int m_a;
};

class BB
{
public:
	friend class CC;
	void Show(AA& a);
private:
	int m_b;
};

class CC
{
public:
	void print(BB& b);
	void test(AA& a);
};
void CC::test(AA& a)
{
	cout << a.m_a << endl;//error,c不能访问a,类CC不是类AA的朋友
}
void BB::Show(AA& a)
{
	cout << a.m_a << endl;
}
void CC::print(BB& b)
{
	cout << b.m_b << endl;
}

 5、重载友元

 cout——ostream类的对象
 cin——istream类的对象

cout<<a;
一般情况下:运算符可以解析成下面两种形式
1、cout.<<(a)  ostream类中重载了<<,程序员不能修改
2、<<(cout,a)  可以在程序员自己定义的类中将<<重载友元
cout<<a<<b;
cout<<a这个表达式作为了上面表达式中的<<的左边——》返回值为引用
(cout<<(a)<<b表达式执行完后,还能继续用<<,说明返回值为ostream类型

friend ostream& operator<<(ostream &out,A &a)

class A;//前项引用声明
ostream& operator<<(ostream& out, A& a);
class A
{
public:
	A(int i=0):m_i(i){}
	void print()
	{
		cout << m_i << endl;
	}
	A operator+(A& b)//this
	{
		return m_i + b.m_i;
	}
	friend A operator-(A& a, A& b);
	A operator++(int)//a++
	{
		int t = m_i;
		m_i = m_i + 1;
		return t;
	}
	friend A& operator++(A& a);
	friend ostream& operator<<(ostream& out, A& a);

private:
	int m_i;
};
A& operator++(A& a)
{
	++a.m_i;
	return a;
}
A operator-(A& a,A&b)
{
	return a.m_i + b.m_i;
}
//cout<<a<<b;      <<(cout,a)<<(cout,b)
ostream& operator<<(ostream& out, A& a)
{
	out << a.m_i;
	return out;
}

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sweep-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值