朋友的功能
類或結構可以宣告它是朋友的任何功能。如果一個函式是一個類的朋友,它可以訪問它的所有受保護和私有成員:
// 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
,而友情函式可以這樣做。