C++之友元函数和友元类

       在介绍类和对象时,已经说过类具有封装性,类中的私有成员一般只有通过该类中的成员函数才可以访问,而程序中的其他函数时无法直接访问类中的私有成员的。如果在一定的条件下需要访问类的私有成员,就必须通过对象来调用类的成员函数,但是频繁的调用会非常的繁琐,也会降低程序的运行效率。为了解决这个问题,有了友元函数这个帮手,但是引进它,也破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员,一般不建议使用友元函数。

       友元函数

       友元函数的特点:

       1,说明在类体内,说明时,在函数的类型说明符前加关键字friend。

       2,定义在类体外时,定义格式和一般的普通函数相同,为:<类型说明符>  <函数名> ( <参数表> )

       3,友元函数时非成员函数,在调用上与普通函数相同。

       4,友元函数可以直接访问类中的私有成员。

       举例编程求两个double型数的点之间的距离:

<span style="font-size:18px;">#include <iostream.h>//头文件命令
#include <math.h>//数学库函数包含文件
class Point
{
public:
	Point(double i,double j)//定义的带两个参数的构造函数
	{
		x=i;
		y=j;
	}
	void Getxy()//一般的成员函数
	{
		cout<<"("<<x<<","<<y<<")"<<endl;
	}
	friend double Distance(Point a,Point b);//在类体内说明的友元函数
private://定义的两个私有成员,只有类的成员函数和友元函数才可以访问
	double x,y;
};
double Distance (Point a,Point b)//友元函数的函数体
{
    double dx=a.x-b.x;
    double dy=a.y-b.y;
	return sqrt(dx*dx+dy*dy);//返回的值时使用数学库中的开根号函数
}
void main()
{
	double d11=3.0,d12=4.0,d21=6.0,d22=8.0;
	Point p1(d11,d12),p2(d21,d22);//定义的两个带参数的类的对象
	p1.Getxy();//通过对象调用成员函数
	p2.Getxy();
	double d=Distance(p1,p2);//如调用普通函数一样调用友元函数
	cout<<"Distance is "<<d<<endl;
}
</span>

程序的分析:

1,通过调用构造函数来对类的对象进行初始化,使得两个对象的参数得到数值。

2,通过对象调用成员函数来输出坐标。

3,通过调用友元函数来输出两个点之间的距离。

 

           友元类

       友元类是把一个类当成另一个类的友元。当一个类作为另一个类的友元时,友元类中的所有成员函数都是另一个类的友元函数。

       友元函数定义格式:friend  class  <类名>

       举例编程实现友元类的使用

#include <iostream.h>//头文件包含命令
class A//定义的类A
{
public:
	friend class B;//定义的友元类B
	void Set(int i) { x=i; }//一般的成员函数
	void Display()
	{
		cout<<"x="<<x<<","<<"y="<<y<<endl;
	}
private:
	int x;
	static int y;//定义的静态数据成员
};
class B//定义的类B
{
public:
	B(int i,int j);//类B的构造函数
	void Display();//类B的一般成员函数
private:
	A a;//定义的私有成员为类A的对象a
};
int A::y=10;//给类A的定义的静态成员赋值
B::B(int i,int j)//类B的构造函数的函数体
{
	a.x=i;//类A的对象的数据成员的调用
	A::y=j;//类A的对象的私有数据成员的调用
}
void B::Display()//类B的一般成员函数的函数体
{
    cout<<"x="<<a.x<<","<<"y="<<A::y<<endl;
}
void main()
{
	A b;//定义的类A的对象
	b.Set(5);//调用类A的成员函数
	b.Display();
	B c(6,9);//定义的带参数的类B的对象
	c.Display();
	b.Display();
}

程序分析:

1,通过调用成员函数来赋值给x,静态数据成员的值为10,因此输出x=5,y=10

2,通过调用构造函数来给类B的对象的成员进行赋值,然后再调用成员函数来输出x=6,y=9

3,在进行第二次的输出时,静态数据成员被更新成9,因此输出x=5,y=9

 


       再次说明在编写程序时,尽量避免用友元函数和友元类,这样会严重影响类的封装性,在大规模的程序运行中会有想不到的后果,也在开发的软件中存在一些大的漏洞。

 

     

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值