类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;
class Box
{
private:
double width;
public:
double length;
void setWidth(double width);
friend void printWidth(Box box); //友元函数
};
友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
class A
{
friend class B; //友元类
public:
void Display();
private:
int m_nData;
};
友元函数
方式一:全局函数声明为友元函数
方式二:其他类的成员函数声明为友元函数(备注:不能为私有函数)
C++中引入友元函数的目的是让函数或类能够访问一个类的私有数据。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend。
友元函数不是当前类的成员函数,需要在其函数名前加上关键字friend,友元函数需要声明在当前类中,而定义可以在类中,也可以在类外。
示例1:友元函数修改类的私有成员数据
class A
{
public:
A()
{
a1 = 100;
a2 = 200;
}
int getA()
{
return this->a1;
}
//声明一个友元函数
friend void setA(A1 *p, int a1); //该说明语句位置与访问描述(private/protected/public)无关
protected:
private:
int a1;
int a2;
};
//友元函数定义
void setA(A *p, int a1)
{
p->a1 = a1;
}
void main()
{
A mya;
cout<<mya.getA()<<endl;
setA(&mya, 300); //通过友元函数 修改A类的私有数据成员
cout<<mya.getA()<<endl;
system("pause");
}
示例2:
#include <iostream>
#include <math.h>
class Point
{
Point(double xi, double yi){X = xi; Y = yi;}
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);
}
void main()
{
Point p1(3.0, 5.0), p2(4.0, 6.0);
double d = Distance(p1, p2);
cout<<"Distance is"<<d<<endl;
}
友元类
声明方式:
若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数,即类 B 的所有成员函数就都可以访问类 A 对象的私有成员。
示例:
#include <iostream>
class A
{
friend class B;
public:
void Display(cout<<x<<endl);
private:
int x;
};
//友元类B
class B
{
public:
void Set(int i){Aobject.x = i;}
void Display() {Aobject.Display}
private:
A Aobject;
};
void main()
{
B Bobject;
Bobject.Set(100);
Bobject.Display();
}