c++的友元函数,详细笔记,细说三种友元用法

本文解释了友元函数在C++中的作用,它允许友元函数访问类的私有成员,区分了友元函数与普通函数的区别,并通过实例展示了三种友元声明方式:友元函数、友元类以及友元类访问另一类的私有成员。
摘要由CSDN通过智能技术生成

解释友元

友元用通俗易懂的话来说,就是:当有人来到你家里,他就只能呆在客厅里面,你是不可能让他来到你的卧室之中的。但是如果这个人是你的朋友,那么你是默许他可以进入你的卧室的。

此时呢?我告诉你,这些分别是什么意思

外来人:普通函数

你家:所在的类

客厅:公有部分

卧室:私有部分

如果这个外来人是朋友:友元函数(只需要加上friend关键字即可),他是可以访问你的私有部分也就是卧室的,但是普通的外来人是不允许的!

什么是友元函数?

首先,了解友元函数之前,我们来想一想类内函数(成员函数)和类外函数有何区别。一,类内函数可以访问类的私有成员,并且自带一个this指针指向成员函数所指向的某一对象。二,类外函数,无法访问类的私有成员,且不带this指针。

比如,如果类内的成员函数我们在调用的时候一定是:对象.函数()这样调用,这就要求了这个函数的第一个,一定是这个对象(这个知识点,我们在后面运算符重载里面讲解),而友元函数是什么?

友元函数和普通的函数并无区别,也没有this指针。怎么做呢?接下来来讲讲:

1 友元函数可以访问一个类的私有成员,而其他的函数是无法访问的

2 他可以不属于任何类的普通函数,也可以是另一个类的成员函数。

怎么声明:

        friend 返回值类型 函数名 (参数列表)

#include<iostream>
using namespace std;


class Date  //日期类
{
private:
   int year; //年
   int month;//月
   int day;//日
public:
   Date(int y, int m, int d) :year(y), month(m), day(d)
   {}
   void show()
   {
       cout << year << "-" << month << "-" << day << endl;
   }
   //声明modifyDate是自己(Date类)的友元,可以访问自己的私有成员
   friend void modifyDate(Date& date, int year, int month, int day);
};

void modifyDate(Date& date, int year, int month, int day)
{   //是Date的友元函数,可以访问date的私有数据
   date.year = year;
   date.month = month;
   date.day = day;
   //date.show();
}


int main()
{
   Date today{ 2024,1,23 };
   today.show();
   modifyDate(today, 2023, 10, 1);
   today.show();
   
   return 0;
}

这里我们定义了一个友元函数,我们在类外写的时候,就像正常写自定义函数一样,该怎么写就怎么写,只不过声明的时候,我们需要在类内声明,并在最前面加上friend,就完了。

第二种友元:


class Date//日期类
{
private:
   int year;
   int month;
   int day;
public:
   Date(int y, int m, int d) :year(y), month(m), day(d)
   {}
   void Calcutetime(const Time& t);//统计当前日期时间(包括日期和时间)是当年第几秒
};

class Time//时间类
{
   //没有写访问权限,默认为private
   int hour;
   int minute;
   int second;
public:
   Time(int h, int m, int s) :hour(h), minute(m), second(s)
   {}
   friend void Date::Calcutetime(const Time& t); //友元函数
};

这里我们直接上代码,我没有去实现函数的能力,只是做一个演示。首先我们在Date类里面写了一个成员函数,但是我们想通过这个成员函数去访问另一个类,也就是Time类的私有成员。我们就只需要在Time类里面,把这个函数在Time里面声明,并加上friend。如此一来,Date就可以直接访问Time类的私有成员了。和第一种大差不差。我们继续

第三种友元函数:


友元类
class Date //日期类
{
private:
    int year;
    int month;
    int day;
public:
    Date(int y, int m, int d) :year(y), month(m), day(d)
    {}
    friend class DateFriend; //友元类,DateFriend是自己(Date类)的友元类
};

class DateFriend//这个类是可以访问Date类的私有成员的
{
public:
    void modifyDate(Date& date, int year, int month, int day);//修改日期
    void show(const Date& date);//输出数据
};

void DateFriend::modifyDate(Date& date, int year, int month, int day)
{
    //友元类,可以直接访问date的私有成员
    date.year = year;
    date.month = month;
    date.day = day;
}
void DateFriend::show(const Date& date)
{
    //友元类,可以直接访问date的私有成员
    cout << date.year << "-" << date.month << "-" << date.day << endl;
}

这个就更简单明了,直接在另一个类中写上当前类的friend,那么当前这个类就可以直接访问到另一个类的所有成员,提醒,另一个类课不能访问当前类的私有成员。

就类似于,你认为他是你的朋友,你允许他访问你的卧室,但是你这么认为他不这么认为,他不觉得你是他的朋友,自然不允许你访问他的私有成员。


每日金句:

        找一个志同道合,步伐一致的人同行。

        如果没有,那就一个人!

                                                                                                                ————雀儿

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值