C++之友元

采用类的机制后实现了数据的隐藏与封装, 类的数据成员一般定义为私有成员, 成员函数一般定义为公有的, 依此提供类与外界间的通信接口。但是, 有时需要定义一些函数, 这些函数不是类的一部分, 但又需要频繁地访问类的数据成员, 这时可以将这些函数定义为该类的友元函数。 除了友元函数外, 还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型和安全性检查及调用的时间开销),但它破坏了类的封装性和隐藏性, 使得非成员函数可以访问类的私有成员。友元可以是一个函数, 该函数被称为友元函数; 友元也可以是一个类, 该类被称为友元类。

同类间无私处 ,异类间有友元
声明为谁的友元,就可以通过谁的对象,访问谁的私有成员

1、友元函数

全局函数作友元, 只需要在相应的类内作友元函数声明即可。 一个函数可以是多个类的友元函数, 只需要在各个类中分别声明。友 元 的 声 明 位 置 , 可 以 是 类 中 任 意 位 置 , 且 其 声 明 不 受 访 问 权 限 关 键 字(public/protected/private) 的影响. 一般放在最开头的位置。用friend来声明

全局函数作友元

class A
{
    friend void globalfunction(A &,...) //友元声明
public:
    ....
};

void globalfunction(A &,...)//函数定义处,全局函数
{}

成员函数作友元

一个类的成员函数作友员, 在声明为另一个类的友员时, 要将原类的作用域加上, 其它属性同全局函数。

class A
{
    friend void One::globalfunction(A&,...);//函数为One类的成员,加上作用域
public:
    ...
}

具体细节:

#include<iostream>
#include<cmath>
using namespace std;
class Point;         //要有前项声明,这就是

class ManagerPoint
{ 
public:
    double distance(Point &a, Point &b);  //必须加上引用或者指针,否则报错
};

class Point
{ 
public:
    Point(double x, double y)
    {
        _x = x;
        _y = y;
    } 
    void getFormatxy();
    friend double ManagerPoint::distance(Point &a, Point &b);
private:
    double _x, _y;
};

前向声明

1 不能定义对象。
2 可以用于定义指向这个类型的指针或引用。
3 用于声明(不是定义), 作为形参类型或者函数的返回值类型。
比如我在某个类中使用到了另一个类,就要使用前向声明,去声明要使用到的类,否则类中不能使用另一个类。

2、友元类

当希望一个类中所有成员函数, 均可存取另一个类的私有成员时, 可以将该类声明为另一类的友元类。友元类, 导致封装破坏的面积扩大化, 但由于其简易操作的特性, 而常常在实战开发中被使用。

class A
{
    friend class B; //友元类
public:

private:
    …
};

3、注意事项

  • 友元关系不能被继承。
  • 友元关系是单向的,不具有交换性。若类 B 是类 A 的友元,类 A 不一定是类 B的友元,要看在类中是否有相应的声明。
  • 友元关系不具有传递性。若类 B 是类 A 的友元,类 C 是 B 的友元,类 C 不一定是类 A 的友元,同样要看类中是否有相应的声明。
Last modification:October 6th, 2019 at 02:14 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment