首先友元不是一个好的设计,它破坏了封装。并且自身有很多局限:比如友元关系不能被继承;友元关系是单向的,不具有交换性;友元关系不具有传递性。

类内声明的 friend 变量(或者函数)在访问该类的成员时,不受 private 的约束。

1. 实现单例

class Printer {
public:
    friend Printer& getPrinter();
private:
    Printer() {
        std::cout << "Printer::Printer()" << std::endl;
    }
};

Printer& getPrinter() {
    static Printer p;         // 唯一的一个打印机对象;
    return p;
}

全局函数 getPrinter()被声明为 Printer类的一个 friend,使得 getPrinter() 不受 private constructors 的约束。