关于C++友元的一点问题,盼大佬给予一点宝贵的见解

小胡同的诗 2019-08-01 10:07:01

想请问一个问题:
1,为什么我A类已经声明为B类的友元类了,但是A类利用友元函数定义重载+号运算符方法的时候,仍然说B类的数据段是私有的;
2,按我的理解来说,A类既然是B类的友元类了,B类的所有成员不是都能访问吗?
3,自己尝试寻找了以下几种答案,但仍然比较模糊,似是而非,希望大佬能给我一个较为合理明确的解答,谢谢您!
i.友元在未实例化的时候不会识别,但A在重载那个友元的加号时候却妄想访问B的实例化对象的数据段;(疑问,这个解答感觉比较靠近答案,但是存在的先后顺序我感觉很怪:1,既然没实例化的时候不会看友元,但是那个重载的地方也是友元呀;2,我最前面已经声明了B和A的类,但定义时的先后顺序结果却不一致,一个是非法地访问私有字段,另一个直接说这个类B没找到???非法???)
ii.有种方法是在类外定义这个重载地友元函数,不过我想知道这种在类里面定义的方法到底可不可以,确切的说就是,我在B中声明了A是B的友元,A内部的操作是不是可以无条见地访问B,如果可以,我这个code该如何修改呢?


#include <iostream>
using namespace std;

class A;
class B;

class B {
int l, r;
public:
friend class A;
B(int l, int r):l(l), r(r){}
void display() {
cout << "B : " << l << " " << r <<endl;
}
};

class A {
int l, r;
public:
A(int l, int r):l(l), r(r){}
int operator + (const int C) { // 1
return this->l + this->r + C;
}

int operator + (const A& B) { // 2
return this->l + this->r + B.l + B.r;
}

friend int operator + (A& a, B& b) { // 3
return a.l + a.r + b.l + b.r;
}

void display() {
cout << "A : " << l << " " << r <<endl;
}
};

int main() {
A p1(1, 2), p2(3, 4);
B p3(5, 6);
p1.display();
p2.display();
p3.display();

cout << p1 + 1 << endl; //找相应的运算符重载列表1
cout << p1 + p2 << endl; //找相应的运算符重载列表2
}

...全文
96 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小胡同的诗 2019-08-01
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错 的回复:
你朋友的朋友不一定是你朋友

意思是我在类A中用友元函数重载的+运算符,此时虽然A是B的朋友,但是这个友元函数也是A的朋友,而不是A本身,所以不能够访问到B类的私有字段是吗?请问这样理解可以吗?
那我只要在B中在声明这个重载的友元函数就能够解决是吗
真相重于对错 2019-08-01
  • 打赏
  • 举报
回复
你朋友的朋友不一定是你朋友
Grit-24 2019-08-01
  • 打赏
  • 举报
回复
友元函数注意事项: (1):友元关系不具有对称性,只是单方面。 (2):友元关系不具有传递性。 差不多可以这么理解 不可以传递

64,637

社区成员

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

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