在C++的friend函数中可以用set()给类private变量赋值吗?
问题解答
首先明确两个核心结论:
- 友元函数本身完全有权限操作类的私有成员,既可以通过public的
set()方法赋值,也可以直接读写私有变量,不需要借助getter/setter。 - 你代码中出现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
相关产品推荐
相关产品推荐

