友元

1、定义:友元位置是在一个类public中的函数,定义的时候不能用类型 类名::函数名,因为不是成员函数,只是朋友的关系,但是友元却可以直接调用私有成员。(友元一般声明为公有)
2、形式:

class X
{
    friend 类型T 函数名称f(参数);
};
T f(参数)
{
    
}

3、通常友元的参数是类类型的,因为这样才能更好地体现友元的意义。
4、友元一般类内声明,类外定义,并且在类内声明的时候要加上friend但是在类外定义的时候不能带着friend。


例如:

#include <iostream>
#include <cmath>
using namespace std;

class Point
{
private:
    int _x,_y;
public:
    Point():_x(0),_y(0){}
    Point (int x):_x(x),_y(x){}
    Point (int x,int y):_x(x),_y(y){}
    Point(const Point &p):_x(p._x),_y(p._y){}
    int getx(){return _x;}
    int gety(){return _y;}
    friend int dist2(Point p,Point q);
};
int dist1(Point p,Point q)
{
    int x=p.getx()-q.getx();
    int y=p.gety()-q.gety();
    return sqrt(x*x+y*y);
}
int dist2(Point p,Point q)//Point ::没有,因为是朋友而不是成员;dist2是Point的朋友,所以可以调用其私有成员;
{
    int x=p._x-q._x;
    int y=p._y-q._y;
    return sqrt(x*x+y*y);
}
int main()
{
    Point p1(0,0),p2(5,0);
    cout<<dist1(p1,p2)<<endl;
    cout<<dist2(p1,p2)<<endl;
}

上例中体现了友元函数的优点
注意:
(1)友元是一种特殊的普通函数,用friend声明友元
(2)友元函数并非类的成员函数
(3)友元不具有逆向性和传递性,例如:若A是B的友元并不表示B是A的友元;若A是B的友元,B是C的友元,也不代表A是C的友元。

拓展:sqrt头文件为#include <cmath>


补充
一、友元分为友元函数和友元类两种
1、友元函数
一个类的友元函数可以访问该类的私有成员
2、友元类
如果类A是类B的友元类,那么A的成员函数可以访问B的私有成员。
例如:

#include <iostream>

using namespace std;
class Point
{
private:
    double _a,_b;
public:
    friend class Line;
};
class Line
{
private:
    Point p1;
    double sum;
public:
    void zonghe()
    {

        sum=p1._a+p1._b;
    }
};
Line是Point的友元类,那么Line可以调用Point中的私有成员;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值