友元允许一个函数或类访问另一类的私有和保护成员,从而突破封装性,实现数据共享。友元有两种类型:友元函数和友元类。

友元使设计更灵活,但也降低了封装性,应谨慎使用。

友元函数

友元函数是一个在类外部定义的函数,但它被授予了访问该类私有成员的权限。友元函数不属于任何类,它只是一个普通函数。

声明:

class Foo {
public:
  friend void bar(Foo&);
};

定义:

void bar(Foo& f) {}

因为友元函数没有this指针:

  • 友元函数需要访问类的非static成员时,需要传入对象做参数;
  • 友元函数需要访问类的static成员或全局变量时,不需要对象做参数;

友元类

友元类的所有成员函数都可以访问该类的私有和保护成员。

class Foo {
private:
    friend class Bar;
    int x;
};

class Bar {
    void bar(Foo& f) {
        std::cout << f.x << std::endl; // 即使是private成员,友元类也能访问
    }
};