C++ 友元 友元函数 友元类 及示例

注意:本文中代码均使用 Qt 开发编译环境
友元
(1)是C++提供的一种破坏数据封装和数据隐藏的机制
(2)通过将一个模块声明为另一个模块的友元,一个模块能引用到另一个模块中本是被隐藏的信息
(3)可以使用友元函数和友元类
(4)为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元

友元函数
(1)友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员
(2)作用:增加灵活性,使程序可以在封装和快速性方面做合理选择
(3)访问对象中的成员必须通过对象名

友元函数的使用方法例如下面的使用友元函数计算两点距离:

#include 
#include 

class Point {
public:
    Point(double xx=0, double yy=0) {
        X = xx;
        Y = yy;
        qDebug() << "Set point(" << X << "," << Y << ")";
    }

    double getX() {
        return X;
    }

    double getY() {
        return Y;
    }

    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);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Point p1(3, 5), p2(4, 6);

    qDebug() << "The result is: " << Distance(p1, p2);

    return a.exec();
}

运行之后的显示结果:

C++ 友元 友元函数 友元类 及示例_第1张图片
友元函数使用示例运行结果

友元类
(1)若一个类为另一个类的友元,则此类的所有成员都可以访问对方类的私有成员
(2)声明:将友元类名在另一各类中使用friend修饰符说明

友元类的使用如下面的示例所示:

#include 
#include 

class A {
    friend class B;

protected:
    void Display() {
        qDebug() << "I`m at A.";
        qDebug() << x;
    }

private:
    int x;
};

class B {
public:
    void Set(int i);
    void Display();

private:
    A a;
};

void B::Set(int i) {
    a.x = i;
}

void B::Display() {
    qDebug() << "I`m at B.";
    a.Display();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    B b;
    b.Set(99);
    b.Display();

    return a.exec();
}

运行结果如下图所示:

C++ 友元 友元函数 友元类 及示例_第2张图片
友元类的使用示例运行结果

你可能感兴趣的:(C++ 友元 友元函数 友元类 及示例)