友元的目的就是让一个函数或类访问另一个函数中的私有成员
友元函数
(1)普通函数作为友元函数
class 类名{
friend 函数返回值类型 友元函数名(形参列表);
//这个形参一般是此类的对象
....
}
经过以上操作后,友元函数就可以访问此类中的私有成员了,下面举个例子
#include <iostream>
using namespace std;
#include <string>
class Person {
friend int getMoney(Person& person);
public:
string name;
private:
int money;
public:
Person(string name, int money);
};
Person::Person(string name, int money) {
this->name = name;
this->money = money;
}
int getMoney(Person &person) {
return person.money;
}
int main() {
Person person("张三", 10000);
cout << getMoney(person) << endl;
}
其中声明了 int getMoney(Person &person)作为友元函数,访问了person类的私有成员money,本例中,通过调用友元函数getMoney访问张三的私有属性money。
普通函数作为友元函数访问了类中的私有成员,且具有修改私有成员的权限
#############################################
(2)其它类的成员函数作为友元函数
其它类中的成员函数作为本类的友元函数时,需要在本类中表明该函数的作用域,并添加友元函数所在类的前向声明,这个要稍微注意一下。
格式:
class B; //A中的成员函数在类B中作为友元函数,要将B类声明在A类之前
class A{
public:
int f();
}
class B{
friend int A::f();//声明类A中的成员函数作为友元函数
}
这样A中的f()就可以访问B类中的所有成员,如下示例
class Car;
class Person {
public:
string name;
public:
Person(string name);
void f(Car &car);
};
class Car {
friend void Person::f(Car& car);//声明友元函数
public:
string name;
Car(string name, string keyPassword);
private:
string keyPassword;
string getkeyPassword();
};
int main() {
Car car("大众", "235fkw");
Person person("张三");
person.f(car);
}
本例中Person类的f()函数在Car类中成为友元函数,f()访问了Car类的私有成员。
跟上面差不多没什么东西,照葫芦画瓢就行了,记住:友元的目的就是让一个函数或类访问另一个函数中的私有成员,再注意下格式就ok了。
#############################################
友元类
友元类可以声明在友元类之后,友元类中的所有成员函数都是该类的友元函数,能够访问该类的所有成员
格式:
class B;
class A{};
classs B{
friend class A;
}
示例也差不多,就不制作学术垃圾了。。。
class Car;
class Person {
public:
string name;
public:
Person(string name);
void f(Car &car);
};
class Car {
friend class Person;
public:
string name;
Car(string name, string keyPassword);
private:
string keyPassword;
string getkeyPassword();
};
最后,使用友元应注意的几个问题
(1)友元声明位置由程序设计者自行决定,且不受类中public,private,protected权限控制符的影响
(2)友元关系是单向的,即类A是类B的友元,但B不是A的友元
(3)友元关系不具有传递性,即类A是类B的友元,类C是类A的友元,但类C不是类A的友元
(4)友元关系不能被继承