C++: 友元friend
1.引出友元
首先看一看如下代码
class A
{
public:
A(int i = 0) :m_i(i) {}
int GetI()const
{
return m_i;
}
void Add(A& a, A& b);
protected:
int m_j;
//friend void Add(A& a, A& b); //将Add函数作为类A的友元,不能在类A中定义
private:
//friend void Add(A& a, A& b);
int m_i;
};
//想在Add函数中访问私有数据成员,又不想通过接口(共有函数)
void Add(A& a, A& b)
{
cout << a.m_j << endl;
cout << a.m_i << endl;
cout << b.m_i << endl;
cout << a.m_i << "+" << b.m_i << "=" << a.m_i + b.m_i << endl;
//cout << a.GetI() + b.GetI() << endl;
}
void main()
{
A a(5);
A b(8);
Add(a, b);
}
我们可以通过GetI()常成员函数来获取A类的私有成员
但是想在Add函数中访问私有数据成员,又不想通过接口(共有函数)
这就需要友元friend了
2.友元的特性
现有一个sum函数:
int Sum(A& a, B& b, C& c)
{
return a.m_i + b.m_j + c.m_k;
}
需要访问A,B,C三类的成员,但是在A类前没有定义B和C两类,会报错:
所以需要向前引用声明,如下:
class B; //前向引用声明--
class C;
class A
{
public:
A(int i = 0) :m_i(i) {}
friend int Sum(A& a, B& b, C& c);
private:
int m_i;
};
class B
{
public:
B(int j = 0) :m_j(j) {}
friend int Sum(A& a, B& b, C& c);
protected:
int m_j;
};
class C
{
public:
C(int k = 0) :m_k(k) {}
friend int Sum(A& a, B& b, C& c);
private:
int m_k;
};
int Sum(A& a, B& b, C& c)
{
return a.m_i + b.m_j + c.m_k;
}
3.友元函数
class A;
class C;
class B
{
public:
B(int j = 0) :m_j(j) {}
void Sub(A& a, C& c);
void Print(A& a);
void test() {}
void show() {}
private:
int m_j;
};
class A
{
public:
A(int i = 0) :m_i(i) {}
friend void B::Sub(A& a, C& c);
friend void B::Print(A& a);
private:
int m_i;
};
class C
{
public:
C(int k = 0) :m_k(k) {}
friend void B::Sub(A& a, C& c);
private:
int m_k;
};
void B::Print(A& a)
{
cout << a.m_i << endl;
}
void B::Sub(A& a, C& c)
{
cout << a.m_i - m_j + c.m_k << endl;
}
void main()
{
A a(40);
B b(20);
C c(10);
b.Sub(a, c);
b.Print(a);
}
在B类中定义了Sub(A& a, C& c)和Print(A& a)函数,而参数中有A类对象a,所以需要在A类里声明Sub和Print是B类型的友元函数(所以需要加上B类作用域“::”)。