수색…


소개

잘 설계된 클래스는 기능을 캡슐화하여 구현을 숨기고 깨끗하고 문서화 된 인터페이스를 제공합니다. 이렇게하면 인터페이스가 변경되지 않는 한 재 설계하거나 변경할 수 있습니다.

보다 복잡한 시나리오에서는 서로의 구현 세부 사항에 의존하는 여러 클래스가 필요할 수 있습니다. 프렌드 클래스 및 기능은 캡슐화 및 문서화 된 인터페이스의 정보 은폐를 손상시키지 않으면 서 이들 피어가 서로의 세부 사항에 액세스 할 수있게합니다.

친구 기능

클래스 나 구조체는 자신이 가진 모든 기능을 선언 할 수 있습니다. 함수가 클래스의 친구라면 함수는 보호 된 멤버와 비공개 멤버 모두에 액세스 할 수 있습니다.

// 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 를 하위 클래스로 분류 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 액세스 할 수 없지만 friend 함수는 PrivateHolder::private_value 액세스 할 수 없습니다.

친구 방법

메소드는 함수뿐만 아니라 친구로 선언 될 수 있습니다.

class Accesser {
public:
    void private_accesser();
};

class PrivateHolder {
public:
    PrivateHolder(int val) : private_value(val) {}
    friend void Accesser::private_accesser();
private:
    int private_value;
};

void Accesser::private_accesser() {
    PrivateHolder ph(10);
    // OK: this method is declares as friend.
    std::cout << ph.private_value << std::endl;
}

친구 클래스

전체 수업은 친구로 선언 될 수 있습니다. 프렌드 클래스 선언은 친구의 모든 멤버가 선언 클래스의 비공개 및 보호 된 멤버에 액세스 할 수 있음을 의미합니다.

class Accesser {
public:
    void private_accesser1();
    void private_accesser2();
};

class PrivateHolder {
public:
    PrivateHolder(int val) : private_value(val) {}
    friend class Accesser;
private:
    int private_value;
};

void Accesser::private_accesser1() {
    PrivateHolder ph(10);
    // OK.
    std::cout << ph.private_value << std::endl;
}

void Accesser::private_accesser2() {
    PrivateHolder ph(10);
    // OK.
    std::cout << ph.private_value + 1 << std::endl;
}

Friend 클래스 선언은 반사적이지 않습니다. 클래스가 양방향으로 개인 액세스가 필요한 경우, 둘 다 친구 선언이 필요합니다.

class Accesser {
public:
    void private_accesser1();
    void private_accesser2();
private:
    int private_value = 0;
};

class PrivateHolder {
public:
    PrivateHolder(int val) : private_value(val) {}
    // Accesser is a friend of PrivateHolder
    friend class Accesser;
    void reverse_accesse() {
        // but PrivateHolder cannot access Accesser's members.
        Accesser a;
        std::cout << a.private_value;
    }
private:
    int private_value;
};


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow