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