前言
在一些场景下,我们需要直接在类的外部直接能够获得或者修改类的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版权协议,转载请附上原文出处链接和本声明。