【C++】友元函数

文章目录

  • 一、友元
  • 二、友元函数
  • 三、友元类

一、友元

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

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

二、友元函数

友元可以是一个函数,该函数被称为友元函数;

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

使用:在函数声明前+friend

class Box
{
   double width;
public:
   double length;
   friend void printWidth( Box box );
   void setWidth( double wid );
};
  • 友元函数可访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用原理相同

比如下题

#include
using namespace std;

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//友元函数声明
	friend bool operator==(const Date& x1,const Date& x2);
private:
	int _year;
	int _month;
	int _day;
};

bool operator==(const Date& x1,const Date& x2)
	{
		return x1._year == x2._year
			&& x1._month == x2._month
			&& x1._day == x2._day;
	}
int main()
{
	//创建两个对象,并赋初始值
	Date d1(1919, 9,9);
	Date d2(1919,9,9);
	if (d1 == d2) {
		cout << "true" << endl;
	}
	else {
		cout << "false" << endl;
	}
	return 0;
}

为了解决类外函数无法访问类中的私有成员变量,我们只需使用友元函数。
friend bool operator==(const Date& x1,const Date& x2);写在类中进行一个声明即可。

三、友元类

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

  • 友元关系是单向的,不具有交换性。
  • 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接
  • 访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
  • 友元关系不能传递
  • 如果C是B的友元, B是A的友元,则不能说明C时A的友元。
  • 友元关系不能继承。
class Time
{
friend class Date; {}// 声明日期类为时间类的友元类,则在日期类中就直接访问Time类
中的私有成员变量
}

你可能感兴趣的:(C++基础,c++)