1友元:C++控制类对象私有部分的访问,但有时候需要在类的外部访问类的私有成员,这种情况下C++提供了友元机制。
创建友元函数步骤:
A:将函数声明放到类的声明中,并在原型前加上关键字friend
friend 返回值 函数名称(参数列表);
friend classclassname;
B:编写友元函数定义,不需要再定义中使用关键字friend.
friend int 友元函数名(const classname &a);
#include <iostream>
using namespace std;
class demo
{
private:
int i;//只能在类的内部访问
public:
demo() //构造函数
{
cout << "demo" << this << endl;
}
demo(const demo &it) //拷贝构造
{
//一旦自己实现了拷贝构造函数,类成员之间的赋值就需要自己完成,编译器不管了
this->i = it.i;
cout << "copy demo" << this << endl;
}
~demo()
{
cout << "~demo" << this << endl;
}
void set_i(int i)
{
this->i = i;
}
int get_i()
{
return i;
}
//意思是声明一个该类的友元函数,该函数可以调用本类的信息
friend void test();
//意思是声明一个该类的友元,该类的信息可以被下面的类调用
friend class demo1;
//demo和demo0互为友元
friend class demo0;
};
void test()
{
//因为这个函数时上面的
demo d;
//这里d.i就是demo中的私有的变量,由于使用了友元,所以test可以使用了
d.i = 100;
printf("%d\n",d.i);
}
class demo0
{
private:
int i;
public:
demo0()
{
demo d;
d.i = 123;
//打印出了123,说明友元中的类可以访问类中变量
printf("%d\n",d.i);
}
};
class demo1
{
public:
demo1()
{
demo d;
d.i = 144;
printf("%d\n",d.i);
}
friend class demo2;
};
//通过下面的例子得出:我的朋友的朋友,不会是我的朋友
class demo2
{
public:
demo2()
{
demo d;
//这一句不能放开,如果放开了报错
//d.i = 155;
}
};
int main(void)
{
test();
demo0 d0;
demo1 d1;
//下面运行的时候报错了,说明友元的一个特点:我的朋友的朋友,不会是我的朋友
//demo2 d2;
return 0;
}
2.运行截图:
3.友元关系说明图