为何友元函数无法修改类的成员变量值?
为什么友元函数修改后对象成员值未发生变化?
你的代码核心问题和友元函数的封装性无关,而是参数传递方式导致的对象副本问题,具体分析如下:
问题根源
你定义的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
相关产品推荐
相关产品推荐

