#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() 함수에서만 의미가 있음