C++中的“友元”

经过一番学习,我知道类中有公有部分和私有部分。关于公有部分,我们是可以在类外进行访问的。但是私有部分却只有在类中才可以进行访问。但是想在类外访问私有部分成员也不是没有办法,那就是——友元(friend)。友元的最大作用也就是——在类外访问类中的私有成员。

友元主要包括两个:友元函数和友元类

 

 

#include<iostream>
using namespace std;

class Time
{
public:
    Time(int, int, int);              //声明构造函数;
    friend void display(Time &);          //声明友元成员函数display(),其中的Time是声明与Time类关联;

private:
    int hour;
    int minute;
    int sec;
};

Time::Time(int h, int m, int s)            //定义构造函数,给hour、minute、sec赋初值;(初始化)
{
    hour = h;
    minute = m;
    sec = s;
}

void display(Time &t)                  //注意,这里多了个‘t’,这个形参t是Time类对象的引用。
{
    cout << t.hour << ":" << t.minute << ":" << t.sec << endl;
}

int main()
{
    Time t1(10, 13, 16);                //这里定义一个Time类的t1,并且赋值为hour=10、minute=13,sec=16.
    display(t1);                      //这里调用display函数,并将实参t1的值带入形参t。
    return 0;
}

上述例子是将一个普通函数声明为友元函数,这其实和类的成员函数引用看起来很相似,但是二者有本质上的区别。类的成员函数的引用,是类的内部调用;而友元函数则是在类外调用类中的私有成员,二者看起来虽然有些相似,但是千万不能弄混淆。

 

将普通函数声明为友元函数使用,虽然是可以的,但是在实际操作中用的不多,大多是直接内部调用即可。而友元函数最大的作用是——在一个类中调用另一个类中的成员函数。

#include<iostream>
using namespace std;
class Date;
class Time
{
public:
    Time(int, int, int);
    void display(Date &);        //注意,此display函数属于Time类,但是指向了Date类;

private:
    int hour;
    int minute;
    int sec;
};

class Date
{
public:
    Date(int, int, int);
    friend void Time::display(Date &);      //这里声明了函数display是Date的友元函数,这个函数本身还是在Time类中(可以在这个display函数中调用Date类中的私有成员);
private:
    int month;
    int day;
    int year;
};

Time::Time(int h, int m, int s)
{
    hour = h;
    minute = m;
    sec = s;
}

Date::Date(int m, int d, int y)
{
    month = m;
    day = d;
    year = y;
}

void Time::display(Date &d)                      //在使用这个友元函数display时也要特别注意,引用了一个'd'('d'是一个形参);
{
    cout << d.month << "/" << d.day << "/" << d.year << endl;
    cout << hour << ":" << minute << ":" << sec << endl;
}

int main()
{
    Time t2(10, 13, 16);
    Date d2(12, 25, 76);
    t2.display(d2);                          //t2引用Time类中的函数display,函数display调用了Date类中的私有成员;
return 0; }

 

 

再次点明开头——“友元”的最大作用就是:在类外访问类中的私有部分。

posted @ 2020-09-21 10:47  勤劳小虾米  阅读(217)  评论(0编辑  收藏  举报