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

小胡同的诗 小胡同的诗 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

想请问一个问题:
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
}

...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
小胡同的诗
C++ 语言 65,214 成员 250,514 内容