C++友元

C++友元

Guderian出品

本文整理自《北京大学公开课:C++面向对象程序设计》

友元很简单,在某种程度上算作是C++设计者对C使用者的妥协。友元分为友元函数友元类两种。

友元函数

一个类的友元函数可以访问该类的私有成员,友元函数不是这个类的成员函数,可以是一个普通的全局函数或其他类的成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class CCar;	//提前声明CCar是一个类,以便后面的CDriver类使用
class CDriver
{
public:
void ModifyCar(CCar *pCar);
};
class CCar
{
private:
int price;
friend int MostExpensiveCar(CCar cars[], int total); //声明友元
friend void CDriver::ModifyCar(CCar *pCar) //声明友元
};
void CDriver::ModifyCar(CCar *pCar)
{
pCar->price += 1000; //汽车改装后价值增加
}
int MostExpensiveCar(CCar cars[], int total)
{
int tmpMax = -1;

for(int i = 0; i < total; ++i)
if(cars[i].price > tmpMax)
tmpMax = cars[i].price;

return tmpMax;
}

可以将一个类的成员函数(包括构造、析构函数)说明为另一个类的友元

1
2
3
4
5
6
7
8
9
class B
{
public:
void function();
};
class A
{
friend void B::function();
};

友元类

如果AB的友元类,那么A的所有成员函数可以访问B的所有私有成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CCar
{
private:
int price;
friend class CDriver; //声明CDriver为友元类
};
class CDriver
{
public:
CCar myCar;
void ModifyCar() //改装汽车
{
myCar.price += 1000;
//因CDriver是CCar的友元类故可以访问其私有成员
}
};
  • 友元类之间的关系不能传递:类A是类B的友元,类C是类B的友元,但类A不是类C的友元
  • 友元类之间的关系不能继承

本文标题:C++友元

文章作者:G-SS-Hacker

发布时间:2019年12月05日 - 20:43:48

最后更新:2019年12月07日 - 10:49:35

原始链接:https://G-SS-Hacker.github.io/C-友元/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。