c++ - Friend函数可以操作对象成员吗?
问题描述
我正在尝试使用 updateRollNo() 函数为对象成员设置值。但它不起作用,我可以使用朋友功能来操作对象数据吗?如果我使用的是学生类成员,那么它工作得很好,但它不能与朋友功能一起工作。
#include<iostream>
using namespace std ;
//Forward declaration
class Student ;
void updateRollNo(Student);
void checkRollNo(Student);
//Define class Student
class Student{
private :
int roll_no ;
//Make friend function
friend void updateRollNo(Student);
friend void checkRollNo(Student);
};
int main(){
Student s1 ;
updateRollNo(s1);
checkRollNo(s1);
cout<<"\n\n";
return 0;
}
//Define function updateRollNo()
void updateRollNo(Student stu){
cout<<"\nEnter student Roll No : ";
cin>>stu.roll_no ;
cout<<endl ;
}
//Define function checkRollNo()
void checkRollNo(Student stu){
cout<<"Roll No : "<<stu.roll_no ;
cout<<endl;
}
解决方案
您的问题与friend
关键字无关(工作正常);问题是您将Student
对象按值传递到updateRollNo()
中,这意味着当内部代码updateRollNo()
设置roll_no
成员变量时,它会将成员变量设置在本地副本 ( stu
) 上,而不是在来自的s1
对象上main()
。这就是为什么,当您随后尝试打印出内部的值时checkRollNo()
,您会发现您打印的值仍然未设置/未初始化。
获得所需行为的一种简单方法是修改updateRollNo()
以通过引用传递参数;也就是说,替换所有实例
void updateRollNo(Student);
和
void updateRollNo(Student &);
这样,它将s1
直接更新,而不是更新s1
.
推荐阅读
- laravel - Laravel Horizon 安装在我的本地机器上失败
- python - Python四舍五入到下一个最高的10次幂
- c - 嵌入式系统上的 C 代码内存对齐问题?
- mysql - 默认情况下,逻辑应用程序中的 MySQL 连接需要本地网关 - 为什么?
- python-3.x - 如何用 Python 处理纹理集问题,我无法创建精灵
- r - Keras 模型属于错误类别 (R)
- php - 如何获取没有和带有特殊(抛光)字符的所有记录
- r - 如何在创建 Txt 输出时将列标题拆分为两行
- ansible - 如何在 Ansible Play 期间修复 Broken pipe 错误
- javascript - 数组解析并转换为具有特定输出的新数组列表