友元函数

友元可以访问包含该友元的类的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;
}

参考qq_26337701的博客

原文地址:https://www.cnblogs.com/narjaja/p/9133757.html