C++中的friend

来源:百度文库 编辑:神马文学网 时间:2024/04/29 21:15:38
C++中的friend2006-09-27 10:03

    在思考C++中的protected时,已经明白了friend的功能,但对于类中friend的声明,是public还是private,还是有点疑惑,于是我还是想详细分析一下friend。

    首先,为什么要在C++中引入friend呢?是为了让函数或类能够访问一个类的private和protected成员。那么,我们为什么不把friend函数自己写为自己的成员函数呢?有时并不是那么容易,比如我们计算矩阵和向量的乘法(Matrix*Vector),如果我们把Vector operator*(const Matrix & m, const Vector & v)作为Matrix的成员函数(要做一定的修改,参数去掉一个),那么它就无法访问Vector的私有成员。同理,作为Vector的成员函数,也无法访问Matrix的私有成员。也就是没有friend类型,你无法使用这个操作。

     有了friend,我们可以把Vector operator*(const Matrix & m, const Vector & v)声明为全局函数,只要在每个类中把operator*作为friend就可以了。

     这里有个问题了,一个类的friend应该声明为什么权限呢?private?public?protected?凭直觉声明为private,只能在类中访问。声明为public则可以在任何地方使用,protected就是在类和子类中可以使用了。但事实呢?friend声明为什么权限都是类似于public的,可以在任何地方使用,为此,我做了一个测试,代码如下:

#include
using namespace std;

class A {
private: // 改为public,protected效果一样
 friend void f(const A & a) {  
  a.print();
 }
private:
 void print() const {
  cout<<"I am class A"< }

};

void main() {
 A a;
 f(a);
}

    由此可见,friend的权限设为什么都是无关紧要的。但是,声明为public让人不致于混淆,所以还是声明为public为妙。