注意:本文中代碼均使用 Qt 開(kāi)發(fā)編譯環(huán)境
友元
(1)是C++提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機(jī)制
(2)通過(guò)將一個(gè)模塊聲明為另一個(gè)模塊的友元帜消,一個(gè)模塊能引用到另一個(gè)模塊中本是被隱藏的信息
(3)可以使用友元函數(shù)和友元類(lèi)
(4)為了確保數(shù)據(jù)的完整性毛肋,及數(shù)據(jù)封裝與隱藏的原則谬莹,建議盡量不使用或少使用友元
友元函數(shù)
(1)友元函數(shù)是在類(lèi)聲明中由關(guān)鍵字friend修飾說(shuō)明的非成員函數(shù)箩祥,在它的函數(shù)體中能夠通過(guò)對(duì)象名訪問(wèn)private和protected成員
(2)作用:增加靈活性,使程序可以在封裝和快速性方面做合理選擇
(3)訪問(wèn)對(duì)象中的成員必須通過(guò)對(duì)象名
友元函數(shù)的使用方法例如下面的使用友元函數(shù)計(jì)算兩點(diǎn)距離:
#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();
}
運(yùn)行之后的顯示結(jié)果:
友元類(lèi)
(1)若一個(gè)類(lèi)為另一個(gè)類(lèi)的友元吧兔,則此類(lèi)的所有成員都可以訪問(wèn)對(duì)方類(lèi)的私有成員
(2)聲明:將友元類(lèi)名在另一各類(lèi)中使用friend修飾符說(shuō)明
友元類(lèi)的使用如下面的示例所示:
#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();
}
運(yùn)行結(jié)果如下圖所示: