C++ Friend 函数

示例

类或结构可以声明它的朋友的任何功能。如果函数是类的朋友,则它可以访问其所有受保护的成员和私有成员:

// 前向声明函数。
void friend_function();
void non_friend_function();

class PrivateHolder {
public:
    PrivateHolder(int val) : private_value(val) {}
private:
    int private_value;
    // 声明为朋友的功能之一。
    friend void friend_function();
};

void non_friend_function() {
    PrivateHolder ph(10);
    // 编译错误:private_value是私有的。
    std::cout <<ph.private_value<< std::endl;
}

void friend_function() {
    // 确定:朋友可以访问私有价值观。
    PrivateHolder ph(10);
    std::cout <<ph.private_value<< std::endl;
}

访问修饰符不会更改朋友的语义。朋友的公开声明,受保护声明和私有声明是等效的。

朋友声明不被继承。例如,如果我们子类化PrivateHolder:

class PrivateHolderDerived : public PrivateHolder {
public:
    PrivateHolderDerived(int val) : PrivateHolder(val) {}
private:
    int derived_private_value = 0;
};

并尝试访问其成员,我们将获得以下信息:

void friend_function() {
    PrivateHolderDerived pd(20);
    // 好。
    std::cout <<pd.private_value<< std::endl;
    // 编译错误:派生的私有值是私有的。
    std::cout <<pd.derived_private_value<< std::endl;
}

请注意,PrivateHolderDerived成员函数无法访问PrivateHolder::private_value,而朋友函数可以访问。