C++: 友元friend

C++: 友元friend

1.引出友元

首先看一看如下代码

class A
{
public:
	A(int i = 0) :m_i(i) {}
	int GetI()const
	{
		return m_i;
	}
	 void Add(A& a, A& b);
protected:
	int m_j;
	//friend void Add(A& a, A& b); //将Add函数作为类A的友元,不能在类A中定义
private:
	//friend void Add(A& a, A& b);
	int m_i;
};
//想在Add函数中访问私有数据成员,又不想通过接口(共有函数)

void Add(A& a, A& b)
{
	cout << a.m_j << endl;
	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;
}
void main()
{
	A a(5);
	A b(8);
	Add(a, b);
}

我们可以通过GetI()常成员函数来获取A类的私有成员
但是想在Add函数中访问私有数据成员,又不想通过接口(共有函数)
这就需要友元friend了

2.友元的特性

在这里插入图片描述
现有一个sum函数:

int Sum(A& a, B& b, C& c)
{
	return a.m_i + b.m_j + c.m_k;
}

需要访问A,B,C三类的成员,但是在A类前没有定义B和C两类,会报错:

在这里插入图片描述
所以需要向前引用声明,如下:

class B; //前向引用声明--
class C;
class A
{
public:
	A(int i = 0) :m_i(i) {}
	friend int Sum(A& a, B& b, C& c);
private:
	int m_i;
};

class B
{
public:
	B(int j = 0) :m_j(j) {}
	friend int Sum(A& a, B& b, C& c);
protected:
	int m_j;
};

class C
{
public:
	C(int k = 0) :m_k(k) {}
	friend int Sum(A& a, B& b, C& c);
private:
	int m_k;
};

int Sum(A& a, B& b, C& c)
{
	return a.m_i + b.m_j + c.m_k;
}

3.友元函数

class A;
class C;

class B
{
public:
	B(int j = 0) :m_j(j) {}
	void Sub(A& a, C& c);
	void Print(A& a);
	void test() {}
	void show() {}
private:
	int m_j;
};

class A
{
public:
	A(int i = 0) :m_i(i) {}
	friend void B::Sub(A& a, C& c);
	friend void B::Print(A& a);
private:
	int m_i;
};

class C
{
public:
	C(int k = 0) :m_k(k) {}
	friend void B::Sub(A& a, C& c);
private:
	int m_k;
};

void B::Print(A& a)
{
	cout << a.m_i << endl;
}

void B::Sub(A& a, C& c)
{
	cout << a.m_i - m_j + c.m_k << endl;
}

void main()
{
	A a(40);
	B b(20);
	C c(10);
	b.Sub(a, c);
	b.Print(a);
}

在B类中定义了Sub(A& a, C& c)和Print(A& a)函数,而参数中有A类对象a,所以需要在A类里声明Sub和Print是B类型的友元函数(所以需要加上B类作用域“::”)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值