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

为何友元函数无法修改类的成员变量值?

为什么友元函数修改后对象成员值未发生变化?

你的代码核心问题和友元函数的封装性无关,而是参数传递方式导致的对象副本问题,具体分析如下:

问题根源

你定义的encapsulationChecker函数采用了传值传递:

void encapsulationChecker(Friendly f, int new_a) {
    f.a = new_a;
}

当你在main中调用encapsulationChecker(f, 23)时,函数会创建一个原对象f的副本,你在函数内修改的只是这个副本的私有成员a,原对象的a值完全不会被改变,所以后续调用display()输出的还是原来的5。

友元函数确实拥有访问类私有成员的权限,你在函数内直接修改f.a的语法是合法的,但因为传值的特性,修改无法作用到原对象上。

解决方案

将函数参数改为引用传递,让函数直接操作原对象而非副本:

void encapsulationChecker(Friendly &f, int new_a) {
    f.a = new_a;
}

修改后,函数内对f.a的修改会直接作用到原对象上,再次调用display()就会输出23。

另外补充:你注释掉的// f.a = 23;在main中无法直接执行,因为a是类的私有成员,只有类的成员函数或友元函数才能访问,这也体现了友元函数突破封装访问私有成员的特性——只是这次的问题和封装无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:10:31