1、友元
类具有数据和隐藏的特性,只有类的成员函数才能访问类的私有成员和保护成员,外部函数只能访问类的公有成员。但在某些情况下,需要在类的外部访问类的私有成员和保护成员。这时,如果通过公有成员函数进行访问,由于参数传递、类型检查和安全性检查等需要时间上的开销,将影响程序的运行效率。为了解决这个问题,而引入了友元。友元可以在类外部直接访问类的私有成员和保护成员,提高了程序的运行效率。
友元提供了不同类或对象的成员函数间、类的成员函数与一般函数之间进行数据共享的机制。对于一个类,可以利用friend关键字将一般函数、其他类的成员函数或者是其他类声明为该类的友元,使得这个类中本来隐藏的信息(包括私有成员和保护成员)可以被友元所访问。如果友元是一般成员函数或是类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都成为友元函数。
(1)友元函数
友元函数不是当前类的成员函数,而是独立于当前类的外部函数(包括普通函数和其他类的成员函数),但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。
友元函数要在类定义时声明,声明时要在其函数名前加上关键字friend。该声明可以放在公有部分,也可以放在私有部分或是保护部分。友元函数的定义通常在类外部。
例子一:普通函数作为类的友元函数
#include<iostream>
using namespace std;
class TIME;
class DATE
{
public:
DATE(int y=2003,int m=1;int d=1):year(y),month(m),day(d){}
friend void DateTime(const DATE &d,const TIME &t);
private:
int year,month,day;
};
class TIME
{
TIME(int h=0,int m=0,int s=0):hour(h),minute(m),second(s){}
friend void DateTime(const DATE &d,const TIME &t);
private:
int hour,minute,second;
};
void DateTime(const DATE &d,const TIME &t)
{
cout<<"Now is"<<d.year>>'.'<<d.month<<'.'<<d.day<<' '
<<t.hour<<':'<<t.minute<<':'<<t.second<<'.'<<endl;
}
int main()
{
DATE d(2003,10,10);
TIME t(10,10,10);
DateTime(d,t);
return 0;
}
例子二:友元成员函数
#include<iostream>
using namespace std;
class TIME;
class DATE
{
public:
DATE(int y=2003,int m=1,int d=1):year(y),month(m),day(d){}
void DateTime(const TIME &t);
private:
int year,month,day;
}
class TIME
{
public:
TIME(int h=0,int m=0,int s=0):hour(h),minute(m),second(s){}
friend void DATE::DateTime(const TIME &t);
private:int hour,minute,second;
}
void DATE::DateTime(const TIME &t)
{
cout<<"Now is"<<d.year>>'.'<<d.month<<'.'<<d.day<<' '
<<t.hour<<':'<<t.minute<<':'<<t.second<<'.'<<endl;
}
int main()
{
DATE d(2003,10,10);
TIME t(10,10,10);
d.DateTime(t);
return 0;
}
例子三:友元类
#include<iostream>
using namespace std;
class TIME;
class DATE
{
public:
DATE(int y=2003,int m=1,int d=1):year(y),month(m),day(d){}
void DateTime(const TIME &t);
private:
int year,month,day;
};
class TIME
{
friend DATE;
public:
TIME(int h=0,int m=0,int s=0):hour(h),minute(m),second(s){}
private:
int hour,minute,second;
};
void DATE::DateTime(const TIME &t)
{
cout<<"Now is"<<d.year>>'.'<<d.month<<'.'<<d.day<<' '
<<t.hour<<':'<<t.minute<<':'<<t.second<<'.'<<endl;
}
int main()
{
DATE d(2003,10,10);
TIME t(10,10,10);
d.DateTime(t);
return 0;
}
友元普通函数、友元成员函数、友元类!!!