1.友元的三种形式
(1).普通的非成员函数被定义为类的友元函数
- 友元函数的声明可以放在私有部分,也可在公有部分,没区别。
- 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
- 友元函数的调用与一般函数的调用方式和原理一致。
(2).把其他类的成员函数定义成友元
class Student;
class Teacher
{
private:
Student* pT;
public:
void assignGrade(Student& s);
};
void test(Student&s);
class Student
{
private:
Teacher *pT;
int someHours;
double grade;
public:
friend void Teacher::assignGrade(Student& s);
friend void test(Student& s);
};
void test(Student&s){
int i=s.someHours;
}
(3).友元类
class Student;
class Teacher
{
private:
Student* pList;
public:
void assignGrade(Student &s);
void adjustHours(Student &s);
};
class Student
{
private:
Teacher*pT;
int somesterHours;
double grade;
public:
friend class Teacher;//在学生类种把教师类声明为友元类
};
2.友元的使用场合
- 运算符重载的某些场合需要使用友元。
- 两个类要共享数据时。
- 注意,友元函数破坏了封装机制,尽量不要使用友元函数。
3.友元函数与类成员函数的区别
- 成员函数有this指针,而友元函数没有this指针。
- 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
- 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
- 友元关系不具有传递性。