目录
友元函数和友元类的应用
友元到底是什么意思?
友元在我的理解中是“朋友之间互通有无的一种表现”,只要在类体中声明了某个函数为友元(切记:这个函数为外来函数,并不是类的成员函数),那么无论这个函数声明在类体中那个位置(private,protected,public三者均可)这个外来函数就可以轻松的访问类体中的所有成员,包括所有的成员函数和成员数据。
什么是友元函数?
首先,我要说的是“友元函数是个外部函数,它不是类的成员函数,如果是成员函数,友元函数不可能无视所有成员权限和自身在类体内被声明的权限,任意地在类体外访问类体内的所有东西”!
其次,友元函数可以无视类中所有数据成员以及成员函数的权限以及自身在类中声明的位置,肆无忌惮的调用任意成员函数和成员数据。
代码示例:
#include <iostream>
#include <string>
using namespace std;
class Cperson
{
private:
string name;
float mark;
public:
Cperson(string name, float mark) {
this->name = name;
this->mark = mark;
}
~Cperson() {};
void ShowInf() {
cout << this->name << endl;
}
friend void AccessName(Cperson &);
};
// 如果把形参改成“sonst person &”那么包含成员数据的成员函数和友元函数全部不可使用,这样做是为了防止无意间改变对象所包含的信息
void AccessName(Cperson &person)
{
cout << person.name << "的分数为" << person.mark << "分" << endl;
person.ShowInf(); // 不但可以访问数据,还可以访问成员函数
}
int main()
{
Cperson person("超级霸霸强", 99.99);
AccessName(person);
}
什么是友元类?
友元类与友元函数类似,同样是无视任何权限,肆无忌惮的访问类体内的所有东西,只不过友元函数只是一个函数,而友元类则是一个成员的集合体,适用范围更广了,
就好比:友元函数是小明的一个超级好朋友,小明的一切对于友元函数来说都不是秘密,友元函数可以任意使用他家里的任意东西;而友元类是和小明的一群超级好朋友,他们熟知小明的一切,而且他们都可以随意使用小明家里的任何东西。
代码示例:
#include <iostream>
#include <string>
using namespace std;
class Cperson
{
private:
string name;
float mark;
friend class Cstudent;
public:
Cperson(string name, float mark) {
this->name = name;
this->mark = mark;
}
~Cperson() {};
};
class Cstudent
{
public:
// 声明为const类型后,对象不可在调用包含成员数据的成员函数,以防止对象的值被无意间篡改
void ShowInf(const Cperson &person) // 友元类中所有函数均是Cperson的友元函数,用法与友元函数一致
{
cout << person.name << "的成绩为" << person.mark << "分" << endl;
}
};
int main()
{
Cperson person("超级霸霸强", 99.99);
Cstudent stud;
stud.ShowInf(person);
}