友元函数在类里边但是并不属于类,而是一个独立的函数,他可以访问类里的私有数据成员
友元函数的声明写在类里面,定义写在类外面,友元函数的参数:对哪一个类的成员进行访问,参数就是那个类的对象
#include<iostream>
using namespace std;
class Student
{
private:
int age;
public:
friend void PrintAge(Student stu);//友元函数的参数是类中的一个对象
void SetAge(int a) { age = a; }
};
void PrintAge(Student stu)
{
cout << "age= " << stu.age << endl;
}
int main()
{
Student me;
me.SetAge(20);
PrintAge(me);//参数是对象名
return 0;
}
练习题1、声明教师类,将其工资声明为私有的,再声明校长类,校长类有一个教师类的友元函数,是这个函数可以修改教师的工资
更改谁的属性,友元函数就写在谁的类里边,然后再在校长类里面写一个跟友元函数名字一样的成员函数,
#include<iostream>
using namespace std;
class Teacher;
class HeadMaster
{
public:
HeadMaster(){}
void SetSalary(Teacher& teacher);
};
class Teacher
{
private:
int m_salary;
public:
Teacher(){}
friend void HeadMaster::SetSalary(Teacher& teacher);
//有参构造函初始化数据
Teacher(int salary)
{
m_salary = salary;
}
void print()
{
cout << "教师当前工资:" << m_salary << endl;
}
};
void HeadMaster::SetSalary(Teacher& teacher)
{
teacher.m_salary = 8000;
}
int main()
{
Teacher me{ 10000 };
HeadMaster you;
me.print();
you.SetSalary(me);//通过校长修改教师工资友元函数的对象是对象
me.print();
return 0;
}
输出结果:
练习题2、
声明用户账户类,将密码设为私有,再声明管理员类,有一个用户账户类友元函数,通过此函数可以修改用户密码(意思就是说如果用户忘记了密码,可以让管理员重新修改)
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Account;
class Manager
{
public:
//修改密码
void setpassword(Account& account);
};
class Account
{
private:
char m_password[20];
public:
Account() {}// 无参构造函数
//友元函数
friend void Manager::setpassword(Account& account);//将友元函数与前面的成员函数关联起来即可修改成员属性
//有参构造函数
Account(const char* password)
{
strcpy(m_password, password);
}
void print()
{
cout << "当前密码:" << m_password << endl;
}
};
void Manager::setpassword(Account& account)
{
strcpy(account.m_password, "111111");
}
int main()
{
Account me("123456");
Manager you;
me.print();
you.setpassword(me);
me.print();
return 0;
}
输出: