Programing

개인 및 보호 회원 : C ++

lottogame 2020. 3. 30. 08:43
반응형

개인 및 보호 회원 : C ++


누군가 수업 시간에 학생들 private의 차이점에 대해 깨달을 수 있습니까 protected?

모범 사례 규칙에서 클래스 외부에서 호출되지 않은 변수 및 함수를 만들어야 private하지만 내 MFC 프로젝트를 보면 MFC 가 선호하는 것으로 알고 있습니다 protected.

차이점은 무엇이고 어떤 것을 사용해야합니까?


개인 멤버는 자신을 정의하는 클래스 내에서만 액세스 할 수 있습니다.

보호 된 멤버는 멤버를 정의하는 클래스와 해당 클래스에서 상속 된 클래스에서 액세스 할 수 있습니다.

편집 : 둘 다 클래스의 친구들과 보호 된 멤버의 경우 파생 클래스의 친구가 액세스 할 수 있습니다.

편집 2 : 문제의 맥락에서 의미가있는 것을 사용하십시오. 커플 링을 줄이고 기본 클래스의 구현을 보호 할 수있을 때마다 멤버를 비공개로 만들어야하지만 불가능한 경우 보호 멤버를 사용하십시오. 문제를 더 잘 이해하려면 C ++ FAQ확인하십시오 . 보호 변수에 대한이 질문 도 도움이 될 수 있습니다.


클래스 A의 공개 멤버는 모든 사람과 누구나 액세스 할 수 있습니다.

클래스 A의 보호 멤버는 A 코드 외부에서 액세스 할 수 없지만 A에서 파생 된 모든 클래스의 코드에서 액세스 할 수 있습니다.

클래스 A의 개인 멤버는 A 코드 외부에서 또는 A에서 파생 된 클래스의 코드에서 액세스 할 수 없습니다.

따라서 결국 보호 또는 개인 중 하나를 선택하면 다음과 같은 질문에 대답 할 수 있습니다. 파생 클래스의 프로그래머에게 어느 정도의 신뢰를 기꺼이 하시겠습니까?

기본적으로 파생 클래스를 신뢰할 수 없다고 가정하고 멤버를 비공개로 만듭니다. 파생 클래스에 어머니 클래스의 내부를 무료로 액세스 할 수있는 충분한 이유가있는 경우 보호 할 수 있습니다.


보호 된 멤버는 파생 클래스에서 액세스 할 수 있습니다. 개인은 할 수 없습니다.

class Base {

private: 
  int MyPrivateInt;
protected: 
  int MyProtectedInt;
public:
  int MyPublicInt;
};

class Derived : Base
{
public:
  int foo1()  { return MyPrivateInt;} // Won't compile!
  int foo2()  { return MyProtectedInt;} // OK  
  int foo3()  { return MyPublicInt;} // OK
};‌‌

class Unrelated 
{
private:
  Base B;
public:
  int foo1()  { return B.MyPrivateInt;} // Won't compile!
  int foo2()  { return B.MyProtectedInt;} // Won't compile
  int foo3()  { return B.MyPublicInt;} // OK
};

"모범 사례"에 따라 다릅니다. 누군가 기존 클래스에서 새 클래스를 파생시키고 내부 멤버에게 액세스해야 할 가능성이 희박한 경우에도 비공개가 아닌 보호로 설정하십시오. 비공개 인 경우 수업을 쉽게 상속받지 못할 수 있습니다.


MFC가 보호를 선호하는 이유는 그것이 프레임 워크이기 때문입니다. MFC 클래스를 서브 클래스로 만들려는 경우 클래스의 일반적인 용도로는 보이지 않는 메소드에 액세스하려면 보호 된 인터페이스가 필요합니다.


그것은 모두 당신이하고 싶은 것과 파생 클래스가 볼 수있는 것에 달려 있습니다.

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // wont work
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}

protected비공개 로 표시된 것으로 표시된 속성 및 메소드는 여전히 서브 클래스에 표시됩니다.

가능한 서브 클래스에서 메소드를 대체 할 가능성을 사용하거나 제공하지 않으려는 경우,이를 작성합니다 private.


보호 멤버 변수 질문을 살펴보십시오 . class커플 링을 줄이려면 private을 기본값 (C ++ ses 처럼)으로 사용하는 것이 좋습니다 . 보호 된 멤버 변수는 항상 나쁜 생각입니다. 예를 들어 템플릿 방법 패턴에 보호 된 멤버 함수를 사용할 수 있습니다.


보호 된 멤버는 클래스의 자손과 동일한 모듈의 코드를 통해서만 액세스 할 수 있습니다. 비공개 멤버는 선언 된 클래스 및 동일한 모듈의 코드를 통해서만 액세스 할 수 있습니다.

물론 친구 기능은 이것을 창 밖으로 던져 버립니다.


개인 멤버는 클래스 내에서만 액세스 할 수 있고 보호 멤버는 클래스 및 파생 클래스에서 액세스 할 수 있습니다. OO 언어의 상속 기능입니다.

C ++에서 개인, 보호 및 공용 상속을 가질 수 있으며, 상속 계층에서 액세스 할 수있는 파생 클래스를 결정합니다. 예를 들어 C #에는 공용 상속 만 있습니다.


개인 = 모선 (기본 수업) 만 이용 가능 (예 : 부모님 만 부모님 침실에 들어갈 수 있음)

보호 = 모선 (기본 수업) 및 딸이 접근 할 수 있음 (즉, 부모 만 부모의 침실로 갈 수 있지만 아들 / 딸이 부모의 침실로 들어가도록 허용 함)

공개 = 모선 (기본 수업), 딸 및 기타 모든 사람이 액세스 할 수 있음 (예 : 부모님 만 부모님의 침실에 들어갈 수 있지만 하우스 파티입니다-mi casa su casa)


파생 클래스에서 보호 된 멤버를 가져오고 업데이트하는 데 공용 멤버 함수가 필요하지 않기 때문에 코드의 효율성이 향상되고 작성해야하는 코드의 양이 줄어 듭니다. 그러나 파생 클래스의 프로그래머는 자신이하는 일을 알고 있어야합니다.


비공개 멤버는 상속 된 클래스와 함께 선언 된 클래스에서 보호 멤버로 액세스 할 수있는 위치를 선언 한 동일한 클래스에서만 액세스 할 수 있습니다.


  • Private : 액세스 지정자입니다. 기본적으로 인스턴스 (멤버) 변수 또는 c ++ / java 클래스의 메소드는 개인용입니다. 상속하는 동안 코드와 데이터는 항상 상속되지만 클래스 외부에서는 액세스 할 수 없습니다. 데이터 멤버를 비공개로 선언하여 아무도 멤버 변수를 직접 변경할 수 없으며 비공개 멤버를 변경하기 위해 공개 게터 및 세터를 제공 할 수 있습니다. 이 개념은 항상 비즈니스 규칙에 적용됩니다.

  • 보호됨 : 액세스 지정자이기도합니다. C ++에서 보호 된 멤버는 클래스 내에서 상속 된 클래스에 액세스 할 수 있지만 클래스 외부에서는 액세스 할 수 없습니다. Java에서 보호 된 멤버는 클래스 내, 상속 된 클래스 및 동일한 패키지 내의 모든 클래스에 액세스 할 수 있습니다.


private회원 데이터에 선호됩니다. C ++ 클래스의 멤버는 private기본적으로입니다.

public의견의 문제이지만 회원 기능에 선호됩니다. 최소한 일부 메소드에 액세스 할 수 있어야합니다. public모든 사람이 이용할 수 있습니다. 가장 유연한 옵션이며 가장 안전하지 않습니다. 누구나 사용할 수 있고 누구나 잘못 사용할 수 있습니다.

private전혀 접근 할 수 없습니다. 수업 밖에서도 사용할 수 없으며 오용 할 수 없습니다. 파생 클래스에는 없습니다.

protected파생 클래스에서 사용할 수 있기 때문에 타협입니다. 클래스에서 파생 될 때 기본 클래스에 대해 잘 이해하고 있으며 이러한 멤버를 오용하지 않도록주의해야합니다.

MFC 그것은 선호, 윈도우 API를위한 C ++ 래퍼 publicprotected. Visual Studio 마법사에 의해 생성 된 클래스 protected에는 public, 및 private멤버가 혼합되어 있습니다. 그러나 MFC 클래스 자체에는 몇 가지 논리가 있습니다.

같은 회원 SetWindowTextpublic종종 이러한 회원에게 액세스해야하기 때문입니다.

와 같은 멤버 OnLButtonDown는 창에서 수신 한 알림을 처리합니다. 액세스해서는 안되므로 protected. 파생 클래스에서 계속 액세스하여 이러한 함수를 재정의 할 수 있습니다.

일부 멤버는 스레드와 메시지 루프를 수행해야하므로 액세스하거나 재정의해서는 안되므로 다음과 같이 선언됩니다. private

C ++ 구조에서 public기본적으로 멤버가 있습니다. 구조체는 일반적으로 메서드가 아닌 데이터에만 사용되므로 public선언은 안전한 것으로 간주됩니다.


보호 된 비 정적 기본 클래스 멤버는 다음 중 하나를 사용하여 해당 기본 클래스에서 파생 된 클래스의 멤버 및 친구가 액세스 할 수 있습니다.

  • 직접 또는 간접적으로 파생 된 클래스에 대한 포인터
  • 직접 또는 간접적으로 파생 된 클래스에 대한 참조
  • 직접 또는 간접적으로 파생 된 클래스의 객체

개인 : 클래스 멤버 기능 및 친구 기능 또는 친구 클래스에서 액세스 할 수 있습니다. C ++ 클래스의 경우 이것이 기본 액세스 지정자입니다.

보호 : 클래스 멤버 함수, 친구 함수 또는 친구 클래스 및 파생 클래스에서 액세스 할 수 있습니다.

  • 클래스 멤버 변수 또는 함수 (typedef 또는 내부 클래스 포함)를 개인 또는 보호 요구 사항에 따라 보호 할 수 있습니다.
  • 대부분의 경우 클래스 멤버를 개인으로 유지하고 캡슐화 할 get / set 함수를 추가하십시오. 이것은 코드 유지 관리에 도움이됩니다.
  • 일반적으로 개인 함수는 공용 함수를 모듈 식으로 유지하거나 단일 코드에 전체 코드를 작성하는 대신 반복 코드를 제거하려는 경우에 사용됩니다. 이것은 코드 유지 관리에 도움이됩니다.

자세한 내용은이 링크참조하십시오 .


개인 및 보호 된 액세스 수정자는 기본 클래스의 보호 된 멤버가 하위 (파생) 클래스의 기본 클래스 범위 밖에서 액세스 할 수있는 유일한 것입니다. 또한 상속에도 동일하게 적용됩니다. 그러나 개인 수정자를 사용하면 기본 클래스의 멤버는 기본 클래스의 범위 또는 코드에서만 액세스 할 수 있으며 그 친구 기능 만 가능합니다 '' ''

참고 URL : https://stackoverflow.com/questions/224966/private-and-protected-members-c

반응형