2020年1月4日

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;
}			

友元普通函数、友元成员函数、友元类!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值