C++友元

0.友元简介

(1)友元存在的意义
在这里插入图片描述
(2)友元的用法

  • 类中以friend关键字声明友元
  • 类的友元可以是其它类或者具体函数
  • 友元不受类中访问级别的限制
  • 友元可以直接访问具体类的所有成员

在类中声明友元后,那么代表了这个友元类或函数就是这个类的朋友。就可以直接访问这个类的所有成员(分享所有秘密)。

1.友元分类

1.1 友元函数
#include<iostream>
#include<cmath>
using namespace std;
 
class Point
{
  public:
     Point(int xx=0,int yy=0) { X=xx; Y=yy; }
     int GetX() { return X; }
     int GetY() { return Y; }
     friend float fDist(Point &a,Point &b); //友元函数声明
 
  private:
     int X,Y;
}; 
float fDist(Point &p1,Point &p2)//友元函数实现
{ 
     double x=double(p1.X-p2.X);  //通过对象访问私有数据成员
     double y=double(p1.Y-p2.Y);
 
     return float(sqrt(x*x+y*y));
}
 
int main()
{
	...
}
1.2 友元类

当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。

关于友元类的注意事项:

  • 友元关系不能被继承
  • 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
  • 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
#include <iostream>

using namespace std;

class A
{
public:
    friend class C;                         //这是友元类的声明
private:
    int data;
};

class C             //友元类定义,为了访问类A中的成员
{
public:
    void set_show(int x, A &a) 
    { a.data = x; cout<<a.data<<endl;}//这里访问了A类的私有成员
};

int main(void)
{
    class A a;
    class C c;
    c.set_show(1, a);
    return 0;
}
1.3 友元成员函数

使类B中的成员函数成为类A的友元函数,这样类B的该成员函数就可以访问类A的所有成员了。

#include <iostream>
using namespace std;

class A;    //当用到友元成员函数时,需注意友元声明与友元定义之间的互相依赖。这是类A的声明
class B
{
public:
    void set_show(int x, A &a);             //该函数是类A的友元函数
};

class A
{
public:
    friend void B::set_show(int x, A &a);   //该函数是友元成员函数的声明
private:
    int data;
    void show() { cout << data << endl; }
};

void B::set_show(int x, A &a)       //只有在定义类A后才能定义该函数,毕竟,它被设为友元是为了访问类A的成员
{
    a.data = x;
    cout << a.data << endl;
}

int main()
{
    class A a;
    class B b;
    b.set_show(1, a);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值