类或结构可以声明它的朋友的任何功能。如果函数是类的朋友,则它可以访问其所有受保护的成员和私有成员:
// 前向声明函数。 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,而朋友函数可以访问。