1 friend介绍
friend的中文含义是“友元”,用来在类外部使用该类的private和protected成员。例如,定义MyClass类如下所示
class MyClass
{public:MyClass(string name){m_name = name;}private:string m_name;
};
自定义函数ShowName()的定义为
void ShowName(MyClass my)
{cout << my.m_name << endl;
}
因为m_name是MyClass的私有成员变量,在类外部不能访问该变量,所以编译程序时会报错,其出错信息为“error C2248: “MyClass::m_name”: 无法访问 private 成员”。
2 将函数定义为类的友元
可以在MyClass定义中将函数ShowName()定义为友元,这样就可以在函数中访问类的private成员了。
在MyClass类的定义中添加如下代码
friend void ShowName(MyClass my);
以上代码的作用是将ShowName()设置为MyClass的友元,之后程序不会报错了。
使用以下代码调用ShowName()函数
MyClass myclass("Hello");
ShowName(myclass);
将会直接打印出“Hello”信息。
3 注意事项
3.1 必须在类内部使用friend
既然是定义类的友元,因此必须在类的内部来使用friend。在类内部的何处使用friend则没有限制,一般我们在类的起始位置或者结束为止出定义友元。
3.2 定义友元不是函数声明
使用friend将函数定义为类的友元,与函数的声明是两个概念。如果只是定义了类的友元而在该函数声明前又使用了这个函数,此时程序会报错。
3.3 定义友元与函数声明没有先后顺序
在Visual Studio中,可以在函数声明前将其定义为类的友元,也可以在声明之后定义。