有元函数
友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元函数 通过对象的引用可以直接 访问私有变量,(不能直接访问私有变量),而一般的函数则不可以。
#include<iostream.h>
class point
{
public:
friend void bb(point cc);
void dd(point cc);
private:
int aa;
};
void bb(point cc)
{int d = cc.aa;} //通过对象的引用可以直接访问
void dd(point cc)
{int d=cc.aa;} //不可以直接访问
下面给出一个比较实用的例子-重载运算符“+”:
#include "stdafx.h"
#include <iostream>
class Complex //复数类
{
private://私有
double real;//实数
double imag;//虚数
public:
Complex(double real=0,double imag=0)
{
this->real=real;
this->imag=imag;
}
friend Complex operator+(Complex &com1, Complex &com2);//友元函数重载双目运算符+
void showSum();
};
Complex operator+(Complex &com1,Complex &com2)//友元运算符重载函数
{
return Complex(com1.real+com2.real,com1.imag+com2.imag);
}
void Complex::showSum()
{
std::cout<<real;
if(imag>0)
std::cout<<"+";
if(imag!=0)
std::cout<<imag<<"i"<<std::endl;
}
int main()
{
Complex com1(10,10),com2(20,-20),sum;
sum=com1+com2;//或sum=operator+(com1,com2)
sum.showSum();//输出复数相加结果
return0;
}
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明