범위 (C++)

클래스, 함수 또는 변수와 같은 프로그램 요소를 선언할 때 해당 이름은 프로그램의 특정 부분에서만 "표시"되고 사용될 수 있습니다. 이름이 표시되는 컨텍스트를 해당 범위라고 합니다. 예를 들어 함수 내에서 변수 x 를 선언하는 경우 해당 함수 x 본문 내에서만 표시됩니다. 로컬 범위가 있습니다. 프로그램에 같은 이름의 다른 변수가 있을 수 있습니다. 서로 다른 범위에 있는 한 하나의 정의 규칙을 위반하지 않으며 오류가 발생하지 않습니다.

자동 비정적 변수의 경우 범위는 프로그램 메모리에서 생성 및 제거되는 시기도 결정합니다.

범위는 6가지입니다.

  • 전역 범위 전역 이름은 클래스, 함수 또는 네임스페이스 외부에서 선언되는 이름입니다. 그러나 C++에서는 이러한 이름조차도 암시적 전역 네임스페이스와 함께 존재합니다. 전역 이름의 범위는 선언 지점에서 선언된 파일의 끝까지 확장됩니다. 전역 이름의 경우 표시 유형은 프로그램의 다른 파일에 이름이 표시되는지 여부를 결정하는 연결 규칙에 의해 제어됩니다.

  • 네임스페이스 범위 클래스 또는 열거형 정의 또는 함수 블록 외부의 네임스페이스 내에서 선언된 이름은 선언 지점에서 네임스페이스 끝까지 표시됩니다. 네임스페이스는 여러 파일에서 여러 블록으로 정의될 수 있습니다.

  • 로컬 범위 매개 변수 이름을 포함하여 함수 또는 람다 내에 선언된 이름은 로컬 범위를 갖습니다. 종종 "지역 주민"이라고 합니다. 선언 지점에서 함수 또는 람다 본문의 끝까지만 표시됩니다. 로컬 범위는 블록 범위의 일종으로, 이 문서의 뒷부분에서 설명합니다.

  • 클래스 범위 클래스 멤버의 이름에는 선언 지점에 관계없이 클래스 정의 전체에 걸쳐 확장되는 클래스 범위가 있습니다. 클래스 멤버 접근성은 , privateprotected 키워드에 public의해 추가로 제어됩니다. 공용 또는 보호된 멤버는 멤버 선택 연산자(또는->) 또는 포인터-멤버 연산자(* 또는 ->*)를 사용해야만 액세스할 수 있습니다.

  • 문 범위 , 또는 ifwhileswitch 문에 for선언된 이름은 문 블록이 끝날 때까지 표시됩니다.

  • 함수 범위레이블 에는 함수 범위가 있습니다. 즉, 선언 지점 이전에도 함수 본문 전체에 표시됩니다. 함수 범위를 사용하면 레이블이 선언되기 전과 같은 goto cleanup 문을 작성할 cleanup 수 있습니다.

이름 숨기기

이름을 포함된 블록에서 선언하여 숨길 수 있습니다. 다음 그림에서는 i가 내부 블록 안에서 다시 선언되므로 바깥쪽 블록 범위에서 i와 연결된 변수가 숨겨집니다.

Diagram that shows block scope name hiding.
블록 범위 및 이름 숨기기

그림에 표시된 프로그램의 출력은 다음과 같습니다.

i = 0
i = 7
j = 9
i = 0

참고

szWhat 인수는 함수 범위에 있는 것으로 간주되므로 함수의 가장 바깥쪽 블록에서 선언된 것처럼 취급됩니다.

클래스 이름 숨기기

함수, 개체, 변수 또는 열거자를 동일한 코드에서 선언하여 클래스 이름을 숨길 수 있습니다. 그러나 키워드 class가 접두사로 지정된 경우에도 클래스 이름에 액세스할 수 있습니다.

// hiding_class_names.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

// Declare class Account at global scope.
class Account
{
public:
    Account( double InitialBalance )
        { balance = InitialBalance; }
    double GetBalance()
        { return balance; }
private:
    double balance;
};

double Account = 15.37;            // Hides class name Account

int main()
{
    class Account Checking( Account ); // Qualifies Account as
                                       //  class name

    cout << "Opening account with a balance of: "
         << Checking.GetBalance() << "\n";
}
//Output: Opening account with a balance of: 15.37

참고

클래스 이름(Account)이 호출되는 모든 위치에서 키워드 클래스를 사용하여 전역 범위 변수 계정과 구분해야 합니다. 이 규칙은 범위 결정 연산자(::)의 왼쪽에 클래스 이름이 나타나는 경우에는 적용되지 않습니다. 범위 결정 연산자의 왼쪽에 있는 이름은 항상 클래스 이름으로 간주됩니다.

다음 예제에서는 키워드를 사용하여 형식 Account 의 개체에 대한 포인터를 선언하는 class 방법을 보여 줍니다.

class Account *Checking = new class Account( Account );

이전 문의 이 Account 니셜라이저 내(괄호 안)에는 전역 범위가 있습니다. 형식 double입니다.

참고

이 예제와 같이 식별자 이름을 다시 사용하는 것은 좋지 않은 프로그래밍 스타일로 간주됩니다.

클래스 개체의 선언 및 초기화에 대한 자세한 내용은 클래스, 구조체 및 공용 구조체를 참조하세요. 무료 저장소 연산자 및 delete 자유 저장소 연산자를 new 사용하는 방법에 대한 자세한 내용은 새 연산자 및 삭제 연산자를 참조하세요.

전역 범위로 이름 숨기기

블록 범위에서 동일한 이름을 명시적으로 선언하여 전역 범위의 이름을 숨길 수 있습니다. 그러나 범위 확인 연산자(::)를 사용하여 전역 범위 이름에 액세스할 수 있습니다.

#include <iostream>

int i = 7;   // i has global scope, outside all blocks
using namespace std;

int main( int argc, char *argv[] ) {
   int i = 5;   // i has block scope, hides i at global scope
   cout << "Block-scoped i has the value: " << i << "\n";
   cout << "Global-scoped i has the value: " << ::i << "\n";
}
Block-scoped i has the value: 5
Global-scoped i has the value: 7

참고 항목

기본 개념