C++中friend函数能否操作对象成员?友元函数赋值私有成员失效问题
问题解答
你可以正常使用友元函数操作类对象的私有数据,当前代码功能失效和友元语法本身无关,是参数传递逻辑错误导致的。
根因分析
- 当前
updateRollNo和checkRollNo的入参都是值传递的Student对象,函数内部操作的是原对象的临时副本 updateRollNo修改的只是副本的roll_no属性,主函数中创建的原对象s1没有被任何改动- 调用
checkRollNo时传入的也是s1的副本,输出的是未初始化的私有成员roll_no的垃圾值
修复方案
将两个函数的入参修改为引用类型,让函数直接操作原对象即可,优化后代码如下:
#include<iostream> using namespace std ; //前置声明 class Student ; void updateRollNo(Student&); void checkRollNo(const Student&); //定义Student类 class Student{ private : int roll_no ; //声明友元函数 friend void updateRollNo(Student&); friend void checkRollNo(const Student&); }; int main(){ Student s1 ; updateRollNo(s1); checkRollNo(s1); cout<<"\n"; return 0; } //定义updateRollNo函数 void updateRollNo(Student& stu){ cout<<"\nEnter student Roll No : "; cin>>stu.roll_no ; cout<<endl ; } //定义checkRollNo函数 void checkRollNo(const Student& stu){ cout<<"Roll No : "<<stu.roll_no ; cout<<endl; }
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

