大家好,在这一小节中,我们来介绍一个新的概念,
称为叫做友元,那么这个友元呢,对应C++关键字里面呢,被称为叫做Friend,
我们来具体看一下这个Friend是一个怎么回事呢?它其实包含了两种类型。
一种呢,被称为叫做友元函数,另外一种呢,称为叫做友元类。
我们首先呢来看一下友元函数。
那么一个类的友元函数就可以访问该类的私有成员。
我们之前在类的访问范围说明符里面讲过,
如果一个成员被声明为是Private的,
那么只有在这个类的成员函数内部才可以被访问到。
除此之外,都不可以访问。
但是在有些时候在涉及函数的时候,有些公共的函数,或者说类成员函数之外
的地方呢你可能会需要用到某个类的私有成员,那怎么办呢?并不是说就被一刀禁止了,
那么你就可以去声明说这个函数是这个类的 友元函数。比方呢,
这个例子为例。我们看到呢,有两个类分别称为叫做CCar和CDriver,
注意,因为在CDriver里头要用到CCar类型定义的一个指针,
所以呢,我们需要首先在CDriver之前呢,
去生命有CCar这样一个类。那么,在CCar这个类里面呢, 它定义了一个
私有的成员变量,叫做price,啊也就是说这个车的价格,是只有
CCar类型的成员函数才能够访问到的。
那么这个时候我可能会需要在一些其他的场合
去访问这个汽车的价格,比方说我有一个函数 称为叫做MostExpensiveCar,
那么我需要知道说最贵的车是哪一个,那么这种时候呢,它本身是一个
在成员函数之外的函数,
那么,我们就把它声明为是友元,这个时候呢它就可以去访问
price这样的一个私有成员。
同时呢,我们也可以去定义其他类的成员函数,是吧,比方说CDriver对应有一个函数
称为叫做ModifyCar,可能是改装这个汽车,那么改装车也需要知道这个车的原始价格啊,
所以呢,那么你作为 其他类的成员函数,你想访问
CCar对应的这样一个私有成员怎么办呢?
你也可以把它声明为是一个friend类型,啊,友元,
那么这时候呢,你就可以在相应的函数内部比如说可以在ModifyCar这个里面
访问对应CCar类型的一个私有成员变量,
同时呢,你也可以在一个 全局函数啊,比方说这样的一个MostExpensiveCar里面
去访问对应的汽车的价格。
那么有了这样的一个友元函数的设计呢就允许大家可以在
某些情况下去访问对应这个类的私有成员。
除了这个友元函数之外呢,我们还可以将一个
成员函数定义为是另外一个类的友元,
比如说,我们可以看到说呢这个
class B里面对应的有 这个一个函数称为叫做function,
同时呢,我们又发现说,咦,我们可以将这个
class B中间的function呢
声明为是class A的友元,
那么这种方式呢,使得说在class
A中间 也可以通过class B的方式来进行访问,
那么注意了,这种成员函数呢,那同样是包含构造和析构函数的。
那么除了友元函数之外呢,还有一种叫做友元类,
那么所谓友元类呢,就是我们把A称之为是B的友元类,
那么A的成员函数就可以去访问
B的私有成员。我们来看一眼,还是刚才这个CCar和CDriver的例子。
我们如果在CCar这个类型里面去声明说
CDriver是我CCar的友元类,
那么这就意味着说CDriver里面的
任何的一个函数,比如说ModifyCar中间
就可以任意访问到CCar类型的私有成员。
啊,也就是,我不需要再在这个里面去声明说ModifyCar这个函数是friend了,
我只需要去定义一个统一的,
这样的一个友元类,那么它同样可以去访问CCar中间的private的一些成员变量。
那么如果我还有其他的一些函数,那么只要在CDriver里头的话,都可以去访问
price这样的一个私有成员。
那么大家要注意的就是友元类呢,是,之间的这个关系呢,
是不能够传递也不能够继承的,
你不能说,A是B的friend,B又是C的friend, 所以A一定是C的friend,
这种关系呢是不成立的。这就是所谓不能传递。