c++:友元函数与友元类详解

目录​​​​​​​

友元函数:

友元函数说明:

操作多个对象数据成员的友元函数:

1:将函数声明为相关类的友元函数:

2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数

友元类:


友元分为:友元函数和友元类

友元函数

1:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

友元函数的优点是:提高编程的灵活性和线程执行的效率。缺点是:破坏了类的封装机制

反例:

示范代码:

#include<iostream>
using namespace std;
class Date
{
	friend void PrintfDate(const Date& d);
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};

void PrintfDate(const Date& d)
{
	cout << d._year << "-" << d._month << "-" << d._day << endl;
}

int main()
{
	Date d(2018,9,10);
	PrintfDate(d);
	return 0;
}

正确结果:

友元函数说明:

  • 友元函数可以访问类的私有成员,但不是类的成员函数,所以也没有隐含的this指针  
  • 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受类的访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数和普通函数的调用原理相同(传值),不需要通过对象来调用

操作多个对象数据成员的友元函数:

1:将函数声明为相关类的友元函数:

如果一个函数需要操作多个不同类对象的非公有成员,有以下两种方式:

class B;//向前引用声明

class A
{
	friend int fun(A & ,B &);//声明为A类友元函数
	//...

};
class B
{
	friend int fun(A &,B &); // 声明为B类友元函数
	//...
};
int fun(A& a, B& b)//fun()函数实现
{};

    这样可以通过fun()函数直接可以访问A,B类对象的非公有成员

由于函数fun()的形参为A类的对象和B类的对象,所以需要使用向前引用声明,因为c++在调用资源时应确保调用前进行过声明或定义,否则调用无效,程序出错

2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数

class A;//向前引用声明

class B
{
	 int fun(A & ,B &);//声明fun为B类的成员元函数
	//...

};
class A
{
	friend int B::fun(A &,B &); // 声明B::fun为A类友元函数
	//...
};
int B::fun(A& a, B& b)//fun()函数实现
{};

友元类:

友元类的所有成员函数的都可以是另一个类的友元函数,,都可以访问另一个类的非公有成员。

class A  //A类
{
	//...//B类成员声明
public:
	friend class B;//声明类A的友元类B
	//...
};
//A,B类的实现
  • 友元关系不能被继承
  • 友元关系是单向的,不具有交换性
  • 友元关系不能传递
#include<iostream>
using namespace std;

class A  //A类
{
	int n;
public:
	A() { n = 5; };
	friend class B;//声明类A的友元类B
};
class B
{
public:
	void printf(A tmp) { cout << tmp.n << endl; };

};
void main()
{
	A a;
	B b;
	b.printf(a);
}

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/82587532