c++高手help,书上“友元成员”的例题有点看不懂?(在线)

来源:百度知道 编辑:UC知道 时间:2024/05/26 00:27:35
书上在讲“友元成员”时,有个例题,好像必需按书上的哪样编写,稍微变动一下,就出错,也不知道原因:

#include "stdafx.h"
#include <iostream>
using namespace std;
/*
下面这个"class A"语句有什么作用啊,去掉怎么出现4个错误,下面不是有"class A"的定义啊?
*/
class A;
class B
{
public:
void display(A &obj);

};
class A
{
int x,y;
public:
A(int vx,int vy)
{
x=vx;
y=vy;
}
void show()
{
cout<<x<<" "<<y<<endl;
}
friend void B::display(A &obj);
};
/*下面类B的成员函数"void display(A&obj)",如果改在类B中定义,又出错,不是友元成员可以在类内定义吗?*/
void B::display(A &obj)
{
obj.x++;
obj.y++;
}

void main()
{
A aobj(4,8);B bobj;
aobj.show();
bobj.display(aobj);
aobj.show();
}

因为C++中有一条很重要的原则,就是“先声明,后使用”,要时刻牢记。
你在类B中声明了这个函数 void display(A &obj),其中用到了A,所以要在前面声明类A,否则编译器不知道这个A是从哪里来的。
同样的道理,你在友元函数中用到了 obj.x++ 和obj.y++这两个表达式,如果你放在类B中定义的话,此时类A还没有定义,你的x和y又是从哪里来的?编译器一样找不到。

class A;只是个声明,否则class B不知道A这个类。
友元函数可以直接访问该类的所有成员,包括私有成员。C++的成员变量和函数默认情况下是private的,所以x,y都是A的私有成员,如果不声明为A的友元函数的话,在B::display(...)这个函数里就不可以直接操作A的x和y,大致就是这样了。

因为class B中用到了class A
所以在B之前要A的声明