C++中向友元函数传递对象是否是必须的?
C++友元函数疑问与数字反转代码问题解答
核心疑问解答
- 友元函数必须关联具体的类对象才能访问类的成员。友元只是赋予函数访问类私有/保护成员的权限,但它本身不是类的成员函数,没有自带的
this指针,所以必须明确指定要操作的对象——要么通过参数传递,要么在函数里使用全局对象(不推荐这种写法)。 - 直接写
n完全行不通,编译器根本不知道你要访问哪个numberRev对象的n,必须通过对象名.n的形式来访问类成员。
你的代码错误原因
你的rev()作为友元函数没有接收对象参数,函数里直接用n,编译器找不到这个变量的定义——因为n是numberRev类的成员,必须绑定到某个具体对象才能被访问,所以才会报'n' was not declared in this scope的错误。
两种修正方案
方案1:传递对象参数(常规写法)
这就是他人代码的思路,通过参数把要操作的对象传给友元函数:
#include <iostream> using namespace std; class numberRev{ int n, i; friend void rev(numberRev r); public: void getData(int num){ n = num; } }; void rev(numberRev r){ int rem; while(r.n>0){ rem = r.n%10; cout<<rem; r.n = r.n/10; } } int main() { numberRev r; r.getData(1234); rev(r); return 0; }
输出:4321
方案2:传递对象引用(更高效)
如果不想拷贝对象,还可以传引用,这样函数里对对象的修改会直接作用在原对象上(如果有需要的话):
#include <iostream> using namespace std; class numberRev{ int n, i; friend void rev(numberRev& r); public: void getData(int num){ n = num; } }; void rev(numberRev& r){ int rem; while(r.n>0){ rem = r.n%10; cout<<rem; r.n = r.n/10; } } int main() { numberRev r; r.getData(1234); rev(r); return 0; }
补充说明
友元函数本质就是拥有类成员访问权限的普通函数,不是类的一部分,所以没有默认的对象上下文,必须显式指定要操作的对象才行。
内容的提问来源于stack exchange,提问作者RohanRameshRaut
相关产品推荐
相关产品推荐

