본문 바로가기

프로그래밍/C++

임시변수의 범위는 어디까지일까요

시작하기 전에

밑의 설명에 다음의 클래스가 항상 정의되어 있다고 가정합니다.

int g_i = 0;

struct Foo
{
   Foo() : i( ++g_i ) { cout << "construct " << i << endl; } // 기본생성자
   Foo( int ) : i( ++g_i ) { cout << "single construct " << i << endl; } // 단일인자 생성자
   Foo( const Foo &foo ) : i( ++g_i )
   { cout << "copy construct " << i << " from " << foo.i << endl; } // 복사생성자
   Foo &operator =( const Foo &foo )
   { cout << "substitute " << ( i = ++g_i ) << " from " << foo.i << endl; } // 대입연산자

   ~Foo() { cout << "destruct " << i << endl; } // 소멸자

   int i;
};

이 클래스는 각각 호출된 생성, 소멸자의 종류를 화면에 출력해주며 생성, 소멸된 객체에 번호를 매겨 그 번호도 함께 출력해줍니다.


임시변수의 유효범위는 얼마나 될까요

Q. 다음의 상황에서 각 임시변수의 소멸 시점은 언제일까요? ( 결과를 맞춰보세요. )

  • 함수 호출 시 인자로 넣어준 임시변수
  1. void foo( Foo ) { Foo(); }
  2. foo( Foo() );
  • 콤마로 이어진 임시변수
  1. Foo(), Foo();


함수 호출 시 인자로 임시 변수를 넣을 때와 아닐 때의 차이점이 있을까요

Q. 다음 두 코드의 차이가 무엇일까요? ( 결과를 맞춰보세요. )

  • 첫 번째 코드
  1. void foo( Foo ) {}
  2. foo( Foo() );
  • 두 번째 코드
  1. void foo( Foo ) {}
  2. Foo f; foo( f );


반복문 혹은 조건문에서 생성한 변수는 어디까지 유효할까요

다음의 코드는 MSVC 7.0부터 가능하게 된 코드입니다.

  1. for( size_t i= 0; i< 10; ++i ){
    1. // TODO : Code is here..
  2. }
  3. size_t i= 0;

for문 내부에 정의한 size_t i는 그 문장(Statement) 내 - 즉, 중괄호{} 내 - 에서만 유효하죠.
그 문장을 벗어난 곳에서 동일한 변수명을 정의하는 것이 가능합니다.
이에 착안하여 for문 뿐만아니라 if문과 while문에서도 그 문장 내부에서만 유효한 변수를 정의하는 것이 가능합니다.

  1. size_t foo() { // TODO : Code is here.. }
  2. if( size_t i = foo() ) {
    1. // TODO : code is here
  3. }

단, while문의 경우 매 루프마다 변수가 새로 정의됩니다.

  1. while( Foo f = Foo() );

위의 코드를 실행하면

  1. construct 1
  2. destruct 1
  3. construct 2
  4. destruct 2
  5. ...

이렇게 매 루프마다 변수를 만들었다 지웠다 합니다.


아래는 동적 할당을 성공했을 때에만 해당 코드를 실행케 하는 코드입니다.

  1. if( Foo *pFoo = new Foo ) {
    1. // TODO : code is here
  2. } else {
    1. // TODO : if not allocated..
  3. }

여기서 유의하여야 할 점은 if ~ else는 서로가 다른 문장처럼 적지만,
실은 하나의 문장이라는 점입니다.
즉, Foo *pFoo, 이 변수를 else 구문에서도 사용할 수 있다는 말입니다.
물론 pFoo에는 NULL이 들은 상태로 있겠죠.


세 줄 요약

  • 임시 변수는 그 문장에서만 유효합니다.
  • 함수 호출시 인자로 임시변수를 넘기면 복사생성자가 아닌 생성자를 호출합니다.
  • 반복문, 조건문의 조건절에서 정의한 변수는 그 문장까지만 유효합니다.

봄노트에서 코드를 작성하고 갖다붙이니 숫자번호가 붙네요 ㅠ
list-style-type:none으로 붙여도 왜 안 사라지는지 흑흑
봄노트랑 태터랑 짬뽕한 써비스 하나 나와줬으면 .. 음음..

봄노트에선 깔끔하게 보실 수 있습니다. ^^
http://digitz.springnote.com/pages/365523.xhtml

'프로그래밍 > C++' 카테고리의 다른 글

STL에 대한 단상  (4) 2008.01.29
C++ 기본 문제 By Choo  (6) 2007.07.26
ANSI와 UTF-8과의 상호 변환  (9) 2007.05.04
스트림에서 스트림으로 전송하기  (0) 2007.03.15
스트림에서 STL 사용하기  (0) 2007.03.14