友元成员函数的问题。这种用法是什么用意?有什么用途?解释一下这种友元方式的类。

cen_jin_long 2008-04-06 06:32:22


class CData2;
class CData
{
public:
CData(int x, int y);
void OutPut(CData2 &);
private:
int nx;
int ny;
};

class CData2
{
public:
CData2(int x, int y);
friend void CData::OutPut(CData2 &);
private:
int nxx;
int nyy;
};

CData::CData(int x, int y)
{
nx = x;
ny = y;
}

void CData::OutPut(CData2 &data2)
{
cout<<"data2.nxx = "<<data2.nxx<<" "<<"data2.nyy = "<<data2.nyy<<endl;
}

CData2::CData2(int x, int y)
{
nxx = x;
nyy = y;
}

int main()
{
CData da(22,3343);
CData2 db(22,33);
da.OutPut(db);
return 1;
}



问题是,CData成员函数OutPut,而在CData2里边被声明为友元?可以这样的吗?为什么不在CData类里直接声明为友元呢?总之不太明白。知道这样就可以访问其他类里的私有成员。但一些理论上的实在不明白。为什么CData2里可以声明Cdata类中的成员函数为友员,这个友员是属于谁的?
...全文
219 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cen_jin_long 2008-04-06
  • 打赏
  • 举报
回复
好。明白,大概明白。
csdn5211 2008-04-06
  • 打赏
  • 举报
回复
请仔细看看我6楼的发言。
cen_jin_long 2008-04-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 csdn5211 的回复:]
引用 8 楼 cen_jin_long 的回复:
class CData2
{
public:
CData2(int x, int y);
friend void CData::OutPut(CData2 &);
private:
int nxx;
int nyy;
};

这里我有点不明白。他只是为CData声明?这个属于自己的什么?成员函数吗?按理不是,但它怎么可以这样。不明白啊。


哪条规定了写在类的括号里就是成员函数?楼主也太执着于此了。
[/Quote]

除了静态和友元,没有其他了?

初通,有点不理解。
csdn5211 2008-04-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cen_jin_long 的回复:]
class CData2
{
public:
CData2(int x, int y);
friend void CData::OutPut(CData2 &);
private:
int nxx;
int nyy;
};

这里我有点不明白。他只是为CData声明?这个属于自己的什么?成员函数吗?按理不是,但它怎么可以这样。不明白啊。
[/Quote]

哪条规定了写在类的括号里就是成员函数?楼主也太执着于此了。
cen_jin_long 2008-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
友元当然是说在类之外有个东西是这个类得朋友。既然它是类得朋友,自然不需要类自己来定义和实现
引用 4 楼 cen_jin_long 的回复:
为什么定义函数时候是在CData里定义,CData2中的声明友元函数不用定义了吗?
[/Quote]

多谢。但如果自己类里边有,那么得实现了吧。
cen_jin_long 2008-04-06
  • 打赏
  • 举报
回复
class CData2
{
public:
CData2(int x, int y);
friend void CData::OutPut(CData2 &);
private:
int nxx;
int nyy;
};

这里我有点不明白。他只是为CData声明?这个属于自己的什么?成员函数吗?按理不是,但它怎么可以这样。不明白啊。
arong1234 2008-04-06
  • 打赏
  • 举报
回复
友元当然是说在类之外有个东西是这个类得朋友。既然它是类得朋友,自然不需要类自己来定义和实现
[Quote=引用 4 楼 cen_jin_long 的回复:]
为什么定义函数时候是在CData里定义,CData2中的声明友元函数不用定义了吗?
[/Quote]
csdn5211 2008-04-06
  • 打赏
  • 举报
回复
总之,就是说,CData2在声明时候,声明一下,除了咱自己的成员函数,还有一哥们也可以访问咱的私有成员,他就是CData家的OutPut(CData2 &)。
hityct1 2008-04-06
  • 打赏
  • 举报
回复
友元是
声明我允许谁访问我的私有成员。


friend void CData::OutPut(CData2 &);
表示CData2允许CData::OutPut访问我的私有成员。
cen_jin_long 2008-04-06
  • 打赏
  • 举报
回复
为什么定义函数时候是在CData里定义,CData2中的声明友元函数不用定义了吗?
csdn5211 2008-04-06
  • 打赏
  • 举报
回复
它是CData的成员函数,当然是CData的对象调用它啊。友元只是给访问权限,并不是说把它弄成了自己的成员函数。
csdn5211 2008-04-06
  • 打赏
  • 举报
回复
要访问的是CData2的成员,所以得在CData2里声明,也就是说,被访问的类负责声明。
cen_jin_long 2008-04-06
  • 打赏
  • 举报
回复
但调用的时候是da.OutPut(db);
非不是OutPut(db)。这样,虽然它在CData2类里被声明为友员。乱啊...

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧