在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类访问另一个类中私有成员
友元的关键字为friend
友元的三种实现
- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元
方法:
在类内的开头加上 : friend 函数类型 函数名(参数);
#include<iostream>
#include<string>
using namespace std;
class B
{
friend void t1(B *p);//声明全局函数为友元,可以访问私有部分
public:
int b=0;
private:
int b1=1;
};
void t1(B *p)
{
cout << "b=" << p->b << endl;
cout << "b1=" << p->b1 << endl;
}
void t1()
{
B p;
t1(&p);
}
int main()
{
t1();
system("pause");
return 0;
}
类做友元
方法:
在类内的开头加上 : friend class 做友元的类名
注意是否需要先声明!!!
#include<iostream>
#include<string>
using namespace std;
class B;//因为B类在A类后面,而A类中先用到了,所以要先声明
class A
{
public:
A();
void f();
B *p;
};
class B
{
friend class A;
public:
int b;
B();
private:
int b1;
};
//类外写成员函数
B::B()//构造函数
{
b = 0;
b1 = 1;
}
A::A()//构造函数
{
p = new B;
//new什么类型就会返回什么类型的指针
//让内部的指针维护堆区的对象
}
void A::f()
{
cout << "b=" << p->b << endl;
cout << "b1=" << p->b1 << endl;
}
void t1()
{
A p1;
p1.f();
}
int main()
{
t1();
system("pause");
return 0;
}
成员函数做友元
方法:
在类内的开头加上 : friend 函数类型 友元的类名::函数名(参数);
注意:函数括号里是什么样的就完全复制
#include<iostream>
#include<string>
using namespace std;
class B;//因为B类在A类后面,而A类中先用到了,所以要先声明
class A
{
public:
A();
void f();
void f1();
B *p;
};
class B
{
friend void A::f1();
//告诉编译器A类下的f1函数是友元,允许访问私有成员
public:
int b;
B();
private:
int b1;
};
//类外实现成员函数
B::B()
{
b = 0; b1 = 1;
}
A::A()
{
p = new B;
}
void A::f()
{
cout << "f函数访问" << "b=" << p->b << endl;
//cout << "b1=" << p->b1;不是友元不能访问
}
void A::f1()
{
cout << "f1函数访问 " << "b=" << p->b << endl;
cout << "f1函数访问" << "b1=" << p->b1 << endl;
//是B类的友元,可以访问私有成员
}
void t1()
{
A p1;
p1.f();
p1.f1();
}
int main()
{
t1();
system("pause");
return 0;
}