C++의 범위

Scope C



C++의 엔터티에는 선언 및/또는 정의할 수 있는 이름이 있습니다. 선언은 정의이지만 정의가 반드시 선언은 아닙니다. 정의는 명명된 엔터티에 대한 메모리를 할당하지만 선언은 명명된 엔터티에 대한 메모리를 할당하거나 할당하지 않을 수 있습니다. 선언적 영역은 엔터티(변수)의 이름이 유효한 프로그램의 가장 큰 부분입니다. 해당 영역을 범위 또는 잠재적 범위라고 합니다. 이 문서에서는 C++의 범위 지정에 대해 설명합니다. 또한 이 기사를 이해하려면 C++에 대한 기본 지식이 필요합니다.

기사 내용

선언적 영역 및 범위

선언적 영역은 엔터티 이름이 유효한 프로그램 텍스트의 가장 큰 부분입니다. 동일한 엔터티를 참조하기 위해 정규화되지 않은 이름을 사용할 수 있는(보이는) 영역입니다. 다음 쇼트 프로그램을 고려하십시오.







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

무효의fn()
{
정수어디= ;
만약 (1==1)
{
비용<<어디<<'N';
}
}

정수기본()
{
fn();
반품 0;
}

함수 fn()에는 두 개의 블록이 있습니다. if 조건을 위한 내부 블록과 함수 본문을 위한 외부 블록입니다. 식별자 var가 도입되어 외부 블록에 표시됩니다. cout 문과 함께 내부 블록에서도 볼 수 있습니다. 외부 및 내부 블록은 모두 var 이름의 범위입니다.



그러나 이름 var는 여전히 내부 블록의 float와 같은 다른 엔터티를 선언하는 데 사용할 수 있습니다. 다음 코드는 이를 보여줍니다.



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

무효의fn()
{
정수어디= ;
만약 (1==1)
{
뜨다어디= 7.5;
비용<<어디<<'N';
}
}

정수기본()
{
fn();
반품 0;
}

출력은 7.5입니다. 이 경우 var라는 이름은 더 이상 내부 블록에서 외부 블록에 도입(선언)된 값 3의 정수를 참조하는 데 사용할 수 없습니다. 이러한 내부 블록을 외부 블록에 선언된 엔티티의 잠재적 범위라고 합니다.





참고: 외부 블록과 같은 동일한 유형의 엔티티는 여전히 내부 블록에서 선언될 수 있습니다. 그러나 이 경우 내부 블록에서 유효한 것은 새로운 선언과 그 의미이며, 내부 블록 외부에서 이전 선언과 그 의미는 외부 블록에서 유효합니다.

내부 블록에서 동일한 이름의 선언은 일반적으로 내부 블록 외부에서 동일한 이름의 선언을 재정의합니다. 내부 블록은 다른 내부 블록을 중첩할 수 있습니다.



글로벌 범위

프로그래머가 파일을 입력하기 시작하면 그것이 전역 범위입니다. 다음 쇼트 프로그램이 이를 보여줍니다.

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

뜨다어디= 9.4;

정수기본()
{
비용 <<어디<<'N';
비용 <<::어디<<'N';

반품 0;
}

출력은 다음과 같습니다.
9.4
9.4

이 경우 var에 대한 선언적 영역 또는 범위는 var에 대한 선언 지점에서 시작하여 파일(번역 단위) 끝까지 아래쪽으로 계속됩니다.

main() 함수의 블록은 다른 범위입니다. 전역 범위에 대한 중첩 범위입니다. 전역 범위의 엔터티에 액세스하려면 다른 범위에서 식별자를 직접 사용하거나 범위 확인 연산자 :: 가 앞에 옵니다.

참고: 엔터티인 main()도 전역 범위에서 선언됩니다.

블록 범위

if, while, do, for 또는 switch 문은 각각 블록을 정의할 수 있습니다. 그러한 진술은 복합 진술입니다. 블록에서 선언된 변수의 이름에는 블록의 범위가 있습니다. 범위는 선언 지점에서 시작하여 블록 끝에서 끝납니다. 다음 짧은 프로그램은 ident 변수에 대해 이것을 보여줍니다.

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

정수기본()
{
만약 (1==1)
{
/*몇몇 문장*/
정수아이덴티티= 5;
비용<<아이덴티티<<'N';
/*몇몇 문장*/
}
반품 0;
}

블록 범위에서 선언된 ident와 같은 변수는 지역 변수입니다.

블록 범위 밖에서 선언된 변수와 그 위에 있는 변수는 블록의 헤더(예: if-block의 조건)와 블록 내에서도 볼 수 있습니다. 다음 짧은 프로그램은 변수, identif에 대해 이것을 보여줍니다:

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

정수기본()
{
정수식별= 8;

만약 (식별== 8)
{
비용<<식별<<'N';
}
반품 0;
}

출력은 8입니다. 여기에는 두 개의 블록 범위가 있습니다. main() 함수에 대한 블록과 중첩된 if-compound 문입니다. 중첩 블록은 main() 함수 블록의 잠재적 범위입니다.

블록 범위에 도입된 선언은 블록 외부에서 볼 수 없습니다. 컴파일되지 않는 다음 짧은 프로그램은 변수 variab을 사용하여 이를 보여줍니다.

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

정수기본()
{
만약 (1 == 1)
{
정수변수= 열 다섯;
}
비용<<변수<<'N'; //오류: 범위 외부에서 액세스했습니다.

반품 0;
}

컴파일러는 variab에 대한 오류 메시지를 생성합니다.

복합 함수의 헤더에 선언된 도입된 엔티티는 복합 명령문 외부(아래)에서 볼 수 없습니다. 다음 for 루프 코드는 컴파일되지 않아 오류 메시지가 표시됩니다.

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

정수기본()
{
~을위한 (정수NS=0;NS<4; ++NS)
{
비용<<NS<<'';
}
비용<<NS<<'';

반품 0;
}

반복 변수 i는 for 루프 블록 내부에서 볼 수 있지만 for 루프 블록 외부에서는 볼 수 없습니다.

기능 범위

기능 블록에 기능 매개변수가 표시됩니다. 펑션 블록에서 선언된 엔터티는 선언 시점부터 펑션 블록 끝까지 보입니다. 다음 쇼트 프로그램이 이를 보여줍니다.

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

문자열 fn(문자열 str)
{
스트리[] = '바나나';
/*기타 문장*/
문자열 totalStr=NS+스트리;
반품totalStr;
}

정수기본()
{
문자열 totStr=fn('먹기 ');
비용<<totStr<<'N';

반품 0;
}

출력은 다음과 같습니다.
바나나 먹기

참고: 함수 외부(위)에서 선언된 엔티티는 함수 매개변수 목록과 함수 블록에서 볼 수 있습니다.

상표

레이블의 범위는 레이블이 표시되는 기능입니다. 다음 코드는 이를 보여줍니다.

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

무효의fn()
{
goto레이블;
/*기타 문장*/
레이블: 정수~ 아니다= 2;
비용<<~ 아니다<<'N';
}

정수기본()
{
fn();

반품 0;
}

출력은 2입니다.

열거 범위

범위가 지정되지 않은 열거
다음 if 블록을 고려하십시오.

만약 (1==1)
{
열거 {에이, ㄴ, ㄷ=NS+2};
비용<<에게<<''<<NS<<''<<<<'N';
}

출력은 0 1 3입니다.

블록의 첫 번째 줄은 열거이고, a, b, c는 열거자입니다. 열거자의 범위는 선언 지점에서 시작하여 열거형 블록의 끝까지입니다.

다음 명령문은 c 선언 지점 이후에 있으므로 컴파일되지 않습니다.

열거 {에게=+2, b, c};

다음 코드 세그먼트는 열거형의 둘러싸는 블록 이후에 열거자가 액세스되기 때문에 컴파일되지 않습니다.

만약 (1==1)
{
열거 {에이, ㄴ, ㄷ=NS+2};
}
비용<<에게<<''<<NS<<''<<<<'N'; //오류: 범위를 벗어남

위의 열거형은 범위가 지정되지 않은 열거형으로 설명되고 해당 열거자는 범위가 지정되지 않은 열거형으로 설명됩니다. 예약어인 enum으로만 시작하기 때문입니다. 열거형 클래스 또는 열거형 구조체로 시작하는 열거형은 범위가 지정된 열거형으로 설명됩니다. 해당 열거자는 범위가 지정된 열거자로 설명됩니다.

범위가 지정된 열거
다음 문장은 괜찮습니다.

열거 수업남성{에이, ㄴ, ㄷ=NS+2};

이것은 범위가 지정된 열거의 예입니다. 클래스 이름은 nam입니다. 여기서 열거자의 범위는 선언 지점부터 열거형 정의 끝까지가 아니라 열거형을 둘러싸는 블록의 끝이 아닙니다. 다음 코드는 컴파일되지 않습니다.

만약 (1==1)
{
열거 수업남성{에이, ㄴ, ㄷ=NS+2};
비용<<에게<<''<<NS<<''<<<<'N'; //오류: 열거형 클래스 또는 열거형 구조체의 범위를 벗어났습니다.
}

클래스 범위

일반 범위 지정을 사용하면 선언적 영역이 한 지점에서 시작하여 다른 지점에서 계속되고 멈춥니다. 범위는 하나의 연속 영역에 있습니다. 클래스를 사용하면 엔터티의 범위가 함께 결합되지 않은 다른 영역에 있을 수 있습니다. 중첩 블록에 대한 규칙은 여전히 ​​적용됩니다. 다음 프로그램은 이를 보여줍니다.

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

//베이스 클래스
수업클라
{
사적인:
정수멤피= 5;
보호:
정수멤프로= 9;
공공의:
무효의fn()
{
비용<<멤피<<'N';
}
};

//파생 클래스
수업더클라: 공공의클라
{
공공의:
정수더멤=멤프로;
};
정수기본()
{
클라 오브제;
사물fn();
더클라 데르 오브제;
비용<<데르오브제.더멤<<'N';

반품 0;
}

출력은 다음과 같습니다.
5
9

클래스 Cla에서 변수 memP는 선언 지점에서 볼 수 있습니다. 그 후, protected의 짧은 부분은 건너뛴 다음 클래스 멤버 함수 블록에서 다시 표시됩니다. 파생 클래스는 건너뛴 다음 main() 함수 범위(블록)에서 다시 표시됩니다.

클래스 Cla에서 변수 memPro는 선언 지점에서 볼 수 있습니다. 공개 함수 fn()의 일부는 건너뛴 다음 파생 클래스 설명 블록에 표시됩니다. main() 함수에서 다시 볼 수 있습니다.

범위 확인 연산자
C++의 범위 확인 연산자는 :: 입니다. 클래스의 정적 멤버에 액세스하는 데 사용됩니다. 다음 프로그램은 이를 보여줍니다.

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

수업클라
{
공공의:
공전 정수 상수나 나= 5;
공공의:
공전 무효의fn()
{
비용<<나 나<<'N';
}
};
정수기본()
{
비용<<클라::나 나<<'N';
클라::fn();

반품 0;
}

출력은 다음과 같습니다.
5
5

정적 멤버는 범위 확인 연산자를 사용하여 액세스하는 main() 함수 블록에서 볼 수 있습니다.

템플릿 매개변수 범위

템플릿 매개변수 이름의 일반 범위는 다음 코드와 같이 선언 지점에서 블록 끝까지 시작됩니다.

주형<유형 이름NS,유형 이름> 구조체나이
{
T 존= 열하나;
너 피터= 12.3;
티 메리= 13;
유 조이= 14.6;
};

U와 T는 블록 내에서 볼 수 있습니다.

템플릿 함수 프로토타입의 경우 범위는 다음 명령문과 같이 선언 지점에서 함수 매개변수 목록의 끝까지 시작됩니다.

주형<유형 이름NS,유형 이름> 무효의기능(너 아니, 유 차,상수 *NS);

그러나 클래스 설명(정의)과 관련하여 범위는 다음 코드와 같이 다른 부분일 수도 있습니다.

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

주형<수업NS,수업> 수업더클라
{
공공의:
t 번호;
공전유 ch;

무효의기능(유 아버지,상수 *NS)
{
비용 << '있다' <<하나에<< '가치 있는 책' <<아니요<<NS<< ' 가게에서.' << 'N';
}
공전 무효의재미있는(유 ch)
{
만약 (채널== '에게')
비용 << '공식 정적 멤버 함수' << 'N';
}
};

정수기본()
{
더클라<정수,>오브제;
사물하나에 = 12;
사물기능('$','500');

반품 0;
}

이름 숨기기

이름 숨기기의 예는 동일한 객체 유형의 이름이 중첩 블록에서 다시 선언될 때 발생합니다. 다음 프로그램은 이를 보여줍니다.

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

무효의fn()
{
정수어디= ;
만약 (1==1)
{
정수어디= 4;
비용<<어디<<'N';
}
비용<<어디<<'N';
}

정수기본()
{
fn();
반품 0;
}

출력은 다음과 같습니다.
4

중첩 블록의 var가 외부 블록의 var를 숨겼기 때문입니다.

동일한 범위에서 선언 반복 가능성

선언의 요점은 해당 범위에서 이름이 처음으로 도입되는 위치입니다.

기능 프로토타입
다른 유형의 다른 엔터티는 일반적으로 동일한 범위에서 선언할 수 없습니다. 그러나 함수 프로토타입은 동일한 범위에서 두 번 이상 선언될 수 있습니다. 두 개의 함수 프로토타입과 해당 함수 정의가 있는 다음 프로그램은 이를 보여줍니다.

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

무효의fn(정수하나에);
무효의fn(정수하나에);

무효의fn(정수하나에)
{
비용<<하나에<<'N';
}

정수기본()
{
fn(5);

반품 0;
}

프로그램이 작동합니다.

오버로드된 함수
오버로드된 함수는 이름은 같지만 함수 서명이 다른 함수입니다. 또 다른 예외로, 동일한 이름을 가진 오버로드된 함수는 동일한 범위에서 정의될 수 있습니다. 다음 프로그램은 이를 보여줍니다.

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

무효의fn(정수하나에)
{
비용<<하나에<<'N';
}

무효의fn(뜨다아니요)
{
비용<<아니요<<'N';
}

정수기본()
{
fn(5);
뜨다바람둥이= 8.7;
fn(바람둥이);

반품 0;
}

출력은 다음과 같습니다.
5
8.7

오버로드된 함수는 전역 범위에서 정의되었습니다.

네임스페이스 범위

Namespace Scope는 자체 기사가 필요합니다. 이 기사는 이 웹사이트인 linuxhint.com을 위해 작성되었습니다. 이 사이트(페이지)의 검색창에 Namespace Scope라는 검색어를 입력하고 확인을 누르면 기사가 나옵니다.

다른 부분의 범위

클래스는 범위가 다른 부분에 있을 수 있는 유일한 체계가 아닙니다. Friend 지정자, 정교한 유형 지정자의 특정 용도, using-directives는 범위가 다른 위치에 있는 다른 체계입니다. 자세한 내용은 나중에 참조하세요.

결론

범위는 선언적 영역입니다. 선언적 영역은 엔터티 이름이 유효한 프로그램 텍스트의 가장 큰 부분입니다. 중첩 블록과 같은 특정 프로그래밍 방식에 따라 둘 이상의 부분으로 나눌 수 있습니다. 선언 지점이 없는 부분은 잠재적 범위를 형성합니다. 잠재적 범위에는 선언이 있을 수도 있고 없을 수도 있습니다.