注意:本文中代码均使用 Qt 开发编译环境
友元
(1)是C++提供的一种破坏数据封装和数据隐藏的机制
(2)通过将一个模块声明为另一个模块的友元,一个模块能引用到另一个模块中本是被隐藏的信息
(3)可以使用友元函数和友元类
(4)为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元
友元函数
(1)友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员
(2)作用:增加灵活性,使程序可以在封装和快速性方面做合理选择
(3)访问对象中的成员必须通过对象名
友元函数的使用方法例如下面的使用友元函数计算两点距离:
#include <QCoreApplication>
#include <QDebug>
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();
}
运行之后的显示结果:
友元类
(1)若一个类为另一个类的友元,则此类的所有成员都可以访问对方类的私有成员
(2)声明:将友元类名在另一各类中使用friend修饰符说明
友元类的使用如下面的示例所示:
#include <QCoreApplication>
#include <QDebug>
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();
}
运行结果如下图所示: