C++ 액세스 지정자

C Access Specifiers



C++에서 클래스는 함께 작동하도록 구성된 변수와 함수의 집합입니다. 클래스의 변수에 값이 주어지면 객체를 얻습니다. 객체는 클래스와 동일한 변수와 기능을 가지고 있지만 이번에는 변수에 값이 있습니다. 하나의 클래스에서 많은 개체를 만들 수 있습니다. 한 개체는 다른 개체의 변수에 할당된 다른 값 집합에 따라 다른 개체와 다릅니다. 클래스에서 객체를 생성하는 것을 객체를 인스턴스화한다고 합니다. 두 개의 서로 다른 객체가 변수에 대해 동일한 값을 갖고 있더라도 이러한 객체는 프로그램에서 서로 다른 이름으로 식별되는 서로 다른 엔티티입니다. 개체 및 해당 클래스의 변수를 데이터 멤버라고 합니다. 객체의 기능과 해당 클래스를 멤버 함수라고 합니다. 데이터 멤버와 멤버 함수를 멤버라고 합니다.

접근이라는 단어는 변수의 값을 읽거나 변경하는 것을 의미하며, 함수를 사용하는 것을 의미하기도 합니다. C++ 액세스 지정자는 private, protected 및 public이라는 단어입니다. 멤버가 해당 클래스의 다른 멤버에 액세스할 수 있는지 또는 클래스 외부에 있고 클래스에 속하지 않는 함수나 연산자가 클래스의 모든 멤버에 액세스할 수 있는지 여부를 결정합니다. 또한 파생(자식) 클래스의 구성원이 상위 클래스의 구성원에 액세스할 수 있는지 여부도 결정합니다.







이 문서를 이해하고 제공된 코드를 테스트하려면 C++에 대한 기본 지식이 필요합니다.



기사 내용

공개 및 비공개 지정자

수업
클래스의 모든 구성원은 public 또는 private으로 레이블이 지정되어 있는 동일한 클래스의 다른 구성원에 액세스할 수 있습니다. 다음 프로그램을 고려하십시오.



#포함하다
사용 네임스페이스시간;

수업더클라
{
사적인:
정수num1;
정수숫자2;
공공의:
더클라(정수n1,정수n2)
{
num1=n1;숫자2=n2;
}
정수방법()
{
반품num1;
}
};

정수기본()
{
더클라 오브제(10,스물);
정수2번=사물방법();
비용<<2번<<'N';

// 정수 번호1 = obj.num1;

반품 0;
}

출력은 10입니다. 개인 멤버는 num1과 num2입니다. 공개 멤버는 TheCla() 및 method()입니다. TheCla()는 관심 변수를 초기화하는 생성자 함수입니다. 액세스 지정자의 영역은 해당 레이블에서 클래스 설명(정의) 끝까지 또는 다른 액세스 지정자의 시작 부분까지 시작됩니다.





main() 함수에서 첫 번째 명령문은 num1 및 num2를 초기화하는 생성자 함수와 관련된 인스턴스화입니다. 다음 명령문은 클래스의 public 멤버인 method()를 호출합니다.

이제 클래스 설명(정의)에서 공용 멤버 함수인 TheCla()가 개인 멤버인 num1 및 num2에 액세스합니다. 또한 public 멤버 함수인 method()는 private 멤버인 num1에 액세스합니다. 클래스 설명 내의 모든 구성원은 동일한 클래스 설명 내의 다른 구성원에 액세스할 수 있습니다. 어떤 구성원이 비공개 또는 공개인지는 중요하지 않습니다.



그러나 클래스 설명 및 클래스 설명 외부에 선언되지 않은 함수 또는 연산자는 클래스의 public 멤버에만 액세스할 수 있습니다. 예를 들어, main() 함수는 클래스 설명 외부에 선언된 함수입니다. method() 및 TheCla() public 멤버에만 액세스할 수 있습니다. main() 함수 내에서 TheCla() 함수는 obj(10, 20)입니다.

main() 함수와 같은 외부 함수 또는 외부 연산자는 num1 또는 num2와 같은 클래스의 비공개 멤버에 액세스할 수 없습니다. main()에서 마지막에 하나뿐인 명령문에서 주석 표시기 //를 제거합니다. 프로그램을 컴파일하려고 하면 프로그램이 컴파일되지 않고 오류 메시지가 표시됩니다.

기본 지정자
클래스의 기본 지정자는 private입니다. 따라서 위의 클래스 설명은 private이지만 지정자가 없는 다음 설명과 동일합니다.

수업더클라
{
정수num1;
정수숫자2;
공공의:
더클라(정수n1,정수n2)
{
num1=n1;숫자2=n2;
}
정수방법()
{
반품num1;
}
};

메모 : 액세스 지정자 레이블은 지정자로 시작하고 그 뒤에 콜론이 옵니다.

보호된 지정자

클래스 설명 내에서, 그리고 외부 함수 또는 외부 연산자에서 보호된 지정자는 개인 지정자와 동일합니다. 이제 위 프로그램의 private 지정자를 지정자로 교체하고 main() 함수의 마지막 하나뿐인 명령문에서 주석 표시자 //를 보호하고 제거합니다. 프로그램을 컴파일하려고 하면 프로그램이 컴파일되지 않고 오류 메시지가 표시됩니다.

보호된 지정자의 문제는 파생된(상속된) 클래스의 멤버가 기본(부모) 클래스의 멤버에 액세스해야 할 때 발생합니다.

공개 파생 클래스 일반 회원과 함께
다음 프로그램을 고려하십시오.

#포함하다
사용 네임스페이스시간;

수업더클라
{
공공의:
정수num1= 10;
보호받는:
정수숫자2= 스물;
사적인:
정수숫자3= 30;
};

수업차일드클라: 공공의더클라
{
공공의:
정수방법1()
{
반품num1;
}
정수방법2()
{
반품숫자2;
}
/*int 메서드3()
{
num3을 반환합니다.
} * /

};

정수기본()
{
ChildCla childObj;
정수1번=아이오브제.방법1();
비용<<1번<<'N';

정수2번=아이오브제.방법2();
비용<<2번<<'N';

반품 0;
}

출력은:
10
스물

기본 클래스에서 num1은 공개, num2는 보호, num3은 비공개입니다. 파생 클래스에서 모든 멤버 함수는 공용입니다. 첫 번째 함수인 method1()은 공개 데이터 멤버인 num1에 액세스합니다. 두 번째 함수인 method2()는 보호된 데이터 멤버인 num2에 액세스합니다. 세 번째 함수인 method3()은 현재 주석 처리되어 있지만 개인 데이터 멤버인 num3에 액세스해야 합니다.

파생 클래스는 액세스 지정자(public, protected 또는 private) 없이 선언되지 않습니다. 위에서 파생 클래스는 public 지정자로 선언됩니다.

수업차일드클라: 공공의더클라{}

이제 파생 클래스에서 세 번째 멤버 함수 정의의 주석 처리를 제거합니다. 프로그램을 컴파일하려고 하면 컴파일되지 않고 오류 메시지가 표시됩니다.

메모 : 전체 파생 클래스가 public으로 선언되면 해당 멤버는 기본 클래스의 private 멤버에 액세스할 수 없습니다. 그러나 해당 멤버는 기본 클래스의 public 및 protected 멤버에 액세스할 수 있습니다. 위의 프로그램은 이것을 보여줍니다.

그러나 public 파생 클래스의 public 멤버는 기본 클래스의 보호된 멤버에 액세스할 수 있습니다.

파생 클래스 지정자와 멤버 지정자

Public 멤버가 있는 보호된 파생 클래스
다음과 같이 위의 파생 클래스 선언에서 public 지정자를 protected로 바꿉니다.

수업차일드클라: 보호받는더클라{}

프로그램을 컴파일하고 실행하고 결과는 이전과 동일합니다.

따라서 전체 파생 클래스가 protected로 선언되면 해당 멤버는 기본 클래스의 private 멤버에 액세스할 수 없습니다. 그러나 해당 멤버는 기본 클래스의 public 및 protected 멤버에 액세스할 수 있습니다. 이는 파생 클래스가 public으로 선언된 경우와 동일합니다.

메모 : public 파생 클래스의 보호된 멤버는 기본 클래스의 보호된 멤버에 액세스할 수 있습니다.

공개 멤버가 있는 비공개 파생 클래스
다음과 같이 위의 파생 클래스 선언에서 protected 지정자를 private로 바꿉니다.

수업차일드클라: 사적인더클라{}

프로그램을 컴파일하고 실행하고 결과는 이전과 동일합니다.

따라서 전체 파생 클래스가 private로 선언되면 해당 멤버는 기본 클래스의 private 멤버에 액세스할 수 없습니다. 그러나 해당 멤버는 기본 클래스의 public 및 protected 멤버에 액세스할 수 있습니다. 이는 파생 클래스가 protected 또는 public으로 선언된 경우와 동일합니다.

보호된 멤버가 있는 공개 파생 클래스
파생 클래스 전체가 보호되고 해당 멤버도 보호되는 다음 프로그램을 입력, 컴파일 및 실행합니다. 일부 코드 세그먼트는 다음과 같습니다.

#포함하다
사용 네임스페이스시간;

수업더클라
{
공공의:
정수num1= 10;
보호받는:
정수숫자2= 스물;
사적인:
정수숫자3= 30;
};

수업차일드클라: 공공의더클라
{
보호받는:
정수방법1()
{
반품num1;
}
정수방법2()
{
반품숫자2;
}
/*int 메서드3()
{
num3을 반환합니다.
} * /

};

정수기본()
{
/*ChildCla childObj;
int no1 = childObj.method1();
비용<
/*int no2 = childObj.method2();
비용<
반품 0;
}

프로그램은 그대로 작동합니다. 출력이 없으며 프로그램이 입력된 방식에 따라 출력이 없어야 합니다.

이제 파생 클래스에서 함수 정의 method3()의 주석 처리를 제거합니다. 프로그램을 컴파일하려고 하면 컴파일되지 않고 오류 메시지가 표시됩니다. 이는 외부 함수, 외부 연산자 또는 파생 클래스에서 private 멤버에 액세스할 수 없음을 의미합니다. 이것은 private 회원에 대한 접근에 대해 위에서 결론을 내린 것과 같은 결론입니다.

메모 : 보호된 파생 클래스의 보호된 멤버는 기본 클래스의 보호된 멤버에 액세스할 수 있습니다.

이제 파생 클래스에 주석을 다시 넣고 main() 함수에서 첫 번째 코드 세그먼트의 주석을 제거합니다. 프로그램을 컴파일하려고 하면 main() 함수의 첫 번째 코드 세그먼트 때문에 프로그램이 컴파일되지 않습니다. 이 효과는 새로운 것이 아닙니다. 파생 클래스, 외부 함수 및 외부 연산자를 제외하고 (기본 또는 파생) 클래스의 protected 및 private 멤버는 동일한 지정자 private입니다. main() 함수는 기본 또는 파생 여부에 관계없이 모든 클래스의 보호된 멤버를 동일한 지정자 비공개로 보고 액세스할 수 없습니다.

main() 함수의 두 번째 코드 세그먼트가 주석 처리되지 않은 경우 동일한 설명이 적용됩니다. 즉, main() 함수는 파생 클래스 또는 기본 클래스의 보호 또는 비공개 멤버에 액세스할 수 없습니다. 이는 파생 클래스의 보호된 멤버가 기본 클래스의 보호된 멤버에 액세스할 수 있는지 여부와 무관합니다.

보호된 멤버가 있는 보호된 파생 클래스
다음과 같이 위의 파생 클래스 선언에서 public 지정자를 protected로 바꿉니다.

수업차일드클라: 보호받는더클라{}

아직 수행되지 않은 경우 코드 세그먼트의 주석을 main() 함수에 다시 넣으십시오. 프로그램을 컴파일하고 실행하고 결과는 이전과 같습니다.

보호된 멤버가 있는 비공개 파생 클래스
다음과 같이 위의 파생 클래스 선언에서 protected 지정자를 private로 바꿉니다.

수업차일드클라: 사적인더클라

프로그램을 컴파일하고 실행하면 결과가 이전과 같을 것입니다.

비공개 멤버가 있는 공개 파생 클래스
다음과 같이 위의 파생 클래스 선언에서 private 지정자를 public으로 바꿉니다.

수업차일드클라: 공공의더클라{}

파생 클래스의 멤버를 비공개로 설정합니다. 프로그램을 컴파일하고 실행합니다. 결과는 보호된 구성원이 있는 공개 파생 클래스의 경우와 다르지 않습니다.

비공개 멤버가 있는 보호된 파생 클래스
다음과 같이 위의 파생 클래스 선언에서 public 지정자를 protected로 바꿉니다.

수업차일드클라: 보호받는더클라{}

프로그램을 컴파일하고 실행합니다. 이 결과는 보호된 구성원이 있는 보호된 파생 클래스의 경우와 다르지 않습니다.

비공개 멤버가 있는 비공개 파생 클래스
다음과 같이 위의 파생 클래스 선언에서 protected 지정자를 private로 바꿉니다.

수업차일드클라: 사적인더클라{}

프로그램을 컴파일하고 실행합니다. 이 결과는 Protected Members가 있는 Private Derived Class의 경우와 다르지 않습니다.

결론

C++ 액세스 지정자는 private, protected 및 public이라는 단어입니다. 클래스 구성원의 액세스 권한을 결정합니다. 액세스 지정자의 영역은 레이블에서 시작하여 클래스 설명(정의) 끝까지 또는 다른 액세스 지정자의 시작 부분까지입니다. 클래스의 모든 구성원은 동일한 클래스의 다른 구성원에 액세스할 수 있습니다. 클래스의 private 멤버는 외부 함수, 외부 연산자 또는 파생 클래스에서 액세스할 수 없습니다.

파생 클래스의 멤버가 기본 클래스의 private 멤버에 액세스할 수 있도록 기본 클래스의 멤버를 보호해야 합니다. 기본 클래스의 이 보호된 멤버는 외부 함수나 외부 연산자에 의해 기본 클래스의 개인 멤버로 간주됩니다.

클래스의 public 멤버는 외부 함수, 외부 연산자 또는 파생 클래스에서 액세스할 수 있습니다.

클래스에 액세스 지정자가 없으면 개인 지정자가 가정됩니다. 즉, 기본 액세스 지정자는 private입니다.

이 작업에 사용된 참조