朋友的功能
类或结构可以声明它是朋友的任何功能。如果一个函数是一个类的朋友,它可以访问它的所有受保护和私有成员:
// Forward declaration of functions.
void friend_function();
void non_friend_function();
class PrivateHolder {
public:
PrivateHolder(int val) : private_value(val) {}
private:
int private_value;
// Declare one of the function as a friend.
friend void friend_function();
};
void non_friend_function() {
PrivateHolder ph(10);
// Compilation error: private_value is private.
std::cout << ph.private_value << std::endl;
}
void friend_function() {
// OK: friends may access private values.
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);
// OK.
std::cout << pd.private_value << std::endl;
// Compilation error: derived_private_value is private.
std::cout << pd.derived_private_value << std::endl;
}
注意 PrivateHolderDerived
成员函数不能访问 PrivateHolder::private_value
,而友情函数可以这样做。