You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++的friend函数中可以用set()给类private变量赋值吗?

问题解答

首先明确两个核心结论:

  1. 友元函数本身完全有权限操作类的私有成员,既可以通过public的set()方法赋值,也可以直接读写私有变量,不需要借助getter/setter。
  2. 你代码中出现sum赋值后还是0的问题,和友元权限无关,是参数值传递导致的。

问题原因分析

你的sumNumber函数参数是Function f,属于值传递:调用时会拷贝生成一个和入参AA完全独立的临时对象,函数内部所有对f的修改都是作用在这个临时拷贝上,不会影响外层的原对象AA。所以你在函数内调用f.setSum(sum)改的是临时对象的sum,AA的sum还是初始化时的默认值0,才会出现第一次输出3 0的结果。

修复方案

只需要把sumNumber的参数改为引用传递即可,修改后函数直接操作原对象,修改会直接同步到外层的AA:

// 类内的友元声明同步修改为引用参数
friend int sumNumber(Function& f);

// 函数实现也改为引用参数
int sumNumber(Function& f) {
    // 方案1:仍然使用setter操作(即使不是友元也可以这么用)
    int sum = f.getA() + f.getB();
    f.setSum(sum);
    return sum;

    // 方案2:利用友元特性直接访问私有成员,代码更简洁
    // f.sum = f.a + f.b;
    // return f.sum;
}

修改后运行输出为:

3 3
3

完全符合预期。

内容的提问来源于stack exchange,提问作者A2111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:15:01