面向对象的基本特征之一是“封装”,类的定义中,通过访问控制修饰符,private
,public
等,对使用该类的“用户”能够访问到的数据进行限制。
但是C++由于历史原因(尤其是要兼容C语言),出现了友元的概念,可以定义能够自由访问private
数据的函数或是类。这破坏面向对象的封装性,因此除了必要情况一般不会使用。
#include <iostream>
using namespace std;
class Demo1;
void test(Demo1 *d);
class Demo1
{
private:
int i;
public:
Demo1(int i)
{
this->i = i;
}
friend void test(Demo1 *d);
};
void test(Demo1 *d)
{
cout << d->i << endl;
}
int main()
{
Demo1 *d = new Demo1(1);
test(d);
delete d;
return 0;
}
Demo1.i
是私有的成员变量,但是我们声明了友元函数后,这个函数就能自由使用Demo1
类中的所有数据了。
下面代码中,定义了Demo1的友元类Demo2,Demo2中就能自由使用Demo1类中的private
成员变量了。
#include <iostream>
using namespace std;
class Demo1;
class Demo2;
class Demo1
{
private:
int i;
public:
Demo1(int i)
{
this->i = i;
}
void showI()
{
cout << this->i << endl;
}
friend class Demo2;
};
class Demo2
{
public:
Demo1 *d;
Demo2(Demo1 *d)
{
this->d = d;
this->d->i = 2;
}
};
int main()
{
Demo1 *d1 = new Demo1(1);
Demo2 *d2 = new Demo2(d1);
d1->showI();
delete d1;
delete d2;
return 0;
}
友元类的的概念和友元函数相同,同样是使用friend
关键字进行定义。