友元函数分为三种情况:
1.类外函数作友元函数
2.类的成员函数做友元函数
3.类中所有成员函数均是友元函数,此时可以定义友元类
下面为三种情况的代码:
1.略(比较简单可参考2.)
这里指出要注意的情况
例:
display做A和B的友元函数
应这样:
声明 class B;(声明不能丢)
定义 class A;(不能丢是因为 在这 友元函数display的声明会用到class B,而系统只看在在此之前有无class B,而不会先去向后找,在回来编译class A)
class B;
2.
#include "stdafx.h"
#include"iostream"
using namespace std;
//a
class B;
class A {
public:
//b
void display(const B &w);
};
class B {
private:
int x;
int y;
public:
B(int x1, int y1) {
x = x1;
y = y1;
}
//c
friend void A::display(const B &w);
};
//c
void A::display(const B &w)
{
cout << w.x << w.y << endl;
}
int main()
{
A a;
B b(1, 1);
a.display(b);
return 0;
}
这种情况经常因疏忽出错在这指出如下要求:
//我们的目的:A中display函数作类B的友元函数一访问B中私有变量x,y
//顺序:
//a.class B;(作用编译器加载类A时,发现里面有类B,若无该声明,系统会报错,不会只能识别找到下面的定义的类B)即系统比较死板,必须见类A加载完
//a注:因为我们只是使用类B定义变量,系统不需要进入到B内部,所以只声明classB就行,调用时系统就比较只能可以自己找到B类了,这也是为甚么我们要在
//类外定义函数的原因,因为定义在类A内系统需要知道B类的内部状况。
//b, class A {};第一步b1:里面声明display(B &a),但不能直接定义函数要在类外定义函数,
//c.class B{};里面写入friend 的声明
//d.类外定义display函数
3.
这个为甚么不用再定义类 A前声明 类B,不太明白?求解答。。。。
- #include <iostream>
- using namespace std;
- class A
- {
- int n;
- public:
- A() { n=5; };
- friend class B; // 说明友元类B
- };
- class B
- {
- public:
- void display(A temp)
- {
- cout << "n=" <<temp.n<<endl;
- }
- };
- int main()
- {
- A a;
- B b;
- b.display(a);
- return 0;
- }