朋友的功能

類或結構可以宣告它是朋友的任何功能。如果一個函式是一個類的朋友,它可以訪問它的所有受保護和私有成員:

// 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,而友情函式可以這樣做。