首页 > 代码库 > 友元函数

友元函数

在介绍友元函数前,先介绍一些概念

公用(public)的成员:在类外可以访问

私有(private)成员:只有本类中的函数可以访问

友元(friend):友元可以访问与其有好友关系的类中的私有成员——有限制的共享


友元包括友元函数友元类

友元函数:如果在本类以外的其它地方定义的函数,在类体中用friend进行声明,此函数称为类的友元函数,友元函数可以访问这个类中的私有成员

友元类:将一个类声明为另一个类的友元类,友元类B中的所有函数都是A类的友元函数,可以访问A类的所有成员


友元函数程序实例:

#include <iostream>

using namespace std;

class Time
{
public:
    //构造函数
    Time(int h, int m, int s);

    //声明display函数为Time类的友元函数
    friend void display(Time &);

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

//构造函数
Time::Time(int h, int m, int s)
{
    hour = h;
    minute = m;
    sec = s;
}

//友元函数,t是Time类对象的引用
void display(Time &t)
{
    cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}

void main1()
{
    Time t1(10,13,56);
    display(t1);

    system("pause");
}


执行结果:


友元类程序实例:

#include <iostream>

using namespace std;

class Date;

class Time
{
public:
    //使用初始化表初始化数据成员
    Time(int h, int m, int s):hour(h),minute(m),sec(s){}

    void display(Date &);

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

class Date
{
public:
    //使用初始化表初始化Date类
    Date(int m, int d, int y):month(m),day(d),year(y){}

    friend void Time::display(Date &);

private:
    int month;
    int day;
    int year;
};

void Time::display(Date & d)
{
    cout<<d.year<<"/"<<d.month<<"/"<<d.day<<endl;

    cout<<hour<<":"<<minute<<":"<<sec<<endl;
}

void main()
{
    Time t1(10,13,56);
    Date d1(12,25,2004);
    t1.display(d1);

    system("pause");
}


程序执行结果:


友元的性质:

友元关系是单向而不是双向的

友元关系不能传递

除非确有必要,一般并不把整个类声明为友元类

使用友元的优势:有助于数据共享,能提高程序的效率

使用友元的劣势:友元可以访问其他类中的私有成员,是对封装原则的破坏,不利于信息隐藏