友元函数
友元可以访问包含该友元的类的private或者protected成员。(这里的友元指的是友元函数或者友元类)
友元函数##
友元函数的声明###
friend <返回类型> <函数名> (<参数列表>);
- 友元函数的声明必须在包含其的类内部,可以放在私有部分也可以放在共有部分。
友元函数的作用域###
- 全局作用域的友元函数:一个类的友元函数,且不作为其他类的成员函数,其作用域在全局作用域下。
- 其他类成员作为该类的友元函数:当一个类的友元函数作为其他类的成员函数时,该函数只能通过类(前面的其他类)的对象进行访问(静态成员函数除外)。
友元函数的定义###
- 全局作用域的友元函数的定义可以在类内部和也可以在类外部,且不需要加类限定。
- 作为其他类成员函数的友元函数的定义必须在类的外部。
友元函数的调用###
- 全局作用域的友元函数的调用不需要通过对象引用。
- 其他类成员作为该类的友元函数只能通过类(前面的其他类)的对象进行访问(静态成员函数除外)。
- 友元函数可以访问拥有其的类(不是其他类)中的私有成员和其他数据,但是需要通过对对象进行引用,对象通过函数参数传递。
注意###
- 一个函数可以是多个类友元函数。
程序##
全局作用域下的友元函数###
#include <iostream>
#include <string>
using namespace std;
class person{
public:
person(string str){
name = str;
age=0;
}
void disp(){
cout<<"name : " << name << endl;
cout<<"age : "<< age <<endl;
}
private:
string name;
int age;
friend void setweigth(person &p,int w);
};
void setweigth(person &pn,int w) {
pn.age=w;
}
int main()
{
person p("zhansan");
setweigth(p,23);
p.disp();
}
友元函数作为其他类的成员函数###
#include <iostream>
using namespace std;
class wheel;
class car{
public:
car(string pn){
name = pn;
}
void run(wheel &w);
private:
string name;
};
class wheel{
public:
wheel(int s){
speed=s;
}
friend void car::run(wheel &w);
private:
int speed;
};
int main(int argc, char const *argv[])
{
wheel w(60);
car c("New car");
c.run(w);
return 0;
}
void car::run(wheel &w) {
cout<<"the car is running"<<endl;
cout<<"name: " << name << " speed :"<< w.speed << endl;
}