友元函数介绍


前言

在一些场景下,我们需要直接在类的外部直接能够获得或者修改类的private/protected成员,这时候就需要引入友元函数


一、友元函数是什么?

友元函数是可以在类的外部直接访问类成员的函数。友元函数的重要作用就是可以提高程序的运行效率,让代码编写更加直观。

二、使用步骤

1.类的定义

代码如下(示例):

class Time
{
private:
	int m_hour;
	int m_minute;
public:
	Time(const int hour, const int minute) { m_hour = hour; m_minute = minute; };
};

2.友元函数的声明

代码如下(示例):

class Time
{
private:
	int m_hour;
	int m_minute;
public:
	Time(const int hour, const int minute) { m_hour = hour; m_minute = minute; };
	// 多加一条声明,注意friend
	friend void print_time(const Time& T);
};

3. 友元函数的定义

在cpp文件中的友元函数定义不需要加上friend,定义格式和一般函数相同
代码如下 (示例)

void print_time(const Time& T)
{
	std::cout << T.m_hour << ":" << T.m_minute << std::endl;
}

三、使用例子

刚才的例子还不能体现友元函数的便利和高效,接下来将给出<(小于)运算符重构的例子。
代码如下 (示例)

1.类的定义

class Time
{
private:
	int m_hour;
	int m_minute;
public:
	Time(const int hour, const int minute) { m_hour = hour; m_minute = minute; };
	friend void print_time(const Time& T);
	// <运算符重载声明
	friend bool operator<(const int minute, const Time& T);
};

2.成员函数声明

#include <Time.h>

void print_time(const Time& T)
{
	std::cout << T.m_hour << ":" << T.m_minute << std::endl;
}

// 使用友元函数实行运算符重载
bool operator<(const int minute, const Time& T)
{
	// 友元函数可以直接获得成员的数据
	int tmp = T.m_hour * 60 + T.m_minute;
	if (minute < tmp)
		return true;

	return false;
}

3.应用

#include <iostream>
#include <Time.h>

int main()
{
	Time T{1, 10};
	
	if (60 < T)
		std::cout << "Y" << std::endl;
	return 0;
}

总结

友元函数简化了为了获取状态的方法调用的繁琐,同时友元函数实际上不属于函数的成员函数,不需要通过对象来进行调用。但是友元函数破环了oop的数据隐藏的特点,这是给程序员的一把双刃剑。


版权声明:本文为golwater原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。