범위(Scope)

C++ 2021. 1. 21. 11:00
#include <iostream>

using namespace std;

int a = 1; // 파일 범위

int f(int a); // 함수 원형 범위

class C {
    int a; // 클래스 범위
public:
    C() { a = 10; }
    void g(); // 클래스 범위
};

void C::g() { // 클래스 멤버 함수
    cout << a << ' ' << ::a << ' ' << f(C::a) << endl;
}

int f(int n) { // 일반(전역)함수
    return n;
}

int main(int argc, const char * argv[]) {
    int b = 2; // 지역 범위(main 함수)
    cout << a << ' ' << b << endl;
    {
        int c = 3; // 지역 범위(안쪽 블록)
        cout << a << ' ' << b << ' ' << c << endl;
        goto L;
        cout << "여기는 절대로 호출되지 않음";
    }
    
    L: // 함수 범위
    C obj;
    obj.g();
    cout << f(5) << endl;
    return 0;
}

 

실행 결과

1 2 

1 2 3

10 1 10

5

 

 

5행

- a는 파일 범위를 가지는 전역 변수, 이 변수는 임의 블록에서 사용 가능

- 이 전역 변수의 이름과 동일한 것이 여러 곳에서 쓰이고 있지만 범위가 각각 다름

- 함수 f()도 파일 범위를 가짐

- 이런 일반 함수는 기본적으로 전역 함수임

- 전역 변수 a와 마찬가지로 프로그램 내 임의의 블록에서 사용할 수 있음

 

7행

- 함수 원형 범위를 설명해 주는 것으로 f()의 함수 원형의 형식 인자로 쓰인 변수 a는 이 원형에서만 유효함

- a나 클래스 범위 변수 a(10행)와는 관련이 없음

 

16행

- 클래스 C의 데이터 멤버 a와 멤버 함수 g()는 클래스 범위를 가짐

- 멤버 함수 g()를 클래스 바깥에서 정의할 때는 클래스 범위를 지정하는 연산자 ::를 사용

 

18행 

- 같은 이름을 같은 변수에 대한 해결이 필요한 예를 보이고 있음

- 전역 변수로서의 a는 임의의 블록에서 사용될 수 있지만 블록 내에 그 이름으로 선언된 변수가 있으면 그 변수가 우선순위를 가짐

- a는 클래스 블록의 a, 클래스 멤버를 지칭

- 전역 변수를 지칭하려면 단항 연산자로서의 전역 범위 연산자(::)를 변수 앞에 붙여야 함

- 클래스 멤버를 나타내는 확실한 방법은 역시 클래스 범위 연산자를 사용하는 것

 

28, 32행

- 지역 범위를 갖는 변수는 28행과 32행에 있음

- 변수 b는 main() 함수 블록에서 사용이 가능함(물론 안쪽 블록에서도 가능)

- 그러나 변수 c는 자신이 선언된 블록에서만 유효

- 함수 f()를 정의하는 21행에서 형식 인자 n이 지역 범위를 갖는 또 다른 변수

- 함수 f()를 c언어 방식으로 정의하면 n이 함수 블록에서만 유효하다는 것을 직관적으로 알 수 있음

int f(n)

int n:

{

 return n;

}

 

38행

- 함수 범위에 해당하는 변수가 포함되어 있음, goto문의 명칭 L은 main() 함수에서만 의미가 있음

'C++' 카테고리의 다른 글

Virtual  (0) 2021.01.22
Swap  (0) 2021.01.22
포인터 연산자 예제  (0) 2021.01.21
예제1  (0) 2021.01.21
static  (0) 2021.01.12
Posted by khon98
,