시작하기 전에
밑의 설명에 다음의 클래스가 항상 정의되어 있다고 가정합니다.
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. 다음의 상황에서 각 임시변수의 소멸 시점은 언제일까요? ( 결과를 맞춰보세요. )
- 함수 호출 시 인자로 넣어준 임시변수
- void foo( Foo ) { Foo(); }
- foo( Foo() );
- 콤마로 이어진 임시변수
- Foo(), Foo();
함수 호출 시 인자로 임시 변수를 넣을 때와 아닐 때의 차이점이 있을까요
Q. 다음 두 코드의 차이가 무엇일까요? ( 결과를 맞춰보세요. )
- 첫 번째 코드
- void foo( Foo ) {}
- foo( Foo() );
- 두 번째 코드
- void foo( Foo ) {}
- Foo f; foo( f );
반복문 혹은 조건문에서 생성한 변수는 어디까지 유효할까요
다음의 코드는 MSVC 7.0부터 가능하게 된 코드입니다.
- for( size_t i= 0; i< 10; ++i ){
- // TODO : Code is here..
- }
- size_t i= 0;
for문 내부에 정의한 size_t i는 그 문장(Statement) 내 - 즉, 중괄호{} 내 - 에서만 유효하죠.
그 문장을 벗어난 곳에서 동일한 변수명을 정의하는 것이 가능합니다.
이에 착안하여 for문 뿐만아니라 if문과 while문에서도 그 문장 내부에서만 유효한 변수를 정의하는 것이 가능합니다.
- size_t foo() { // TODO : Code is here.. }
- if( size_t i = foo() ) {
- // TODO : code is here
- }
단, while문의 경우 매 루프마다 변수가 새로 정의됩니다.
- while( Foo f = Foo() );
위의 코드를 실행하면
- construct 1
- destruct 1
- construct 2
- destruct 2
- ...
이렇게 매 루프마다 변수를 만들었다 지웠다 합니다.
아래는 동적 할당을 성공했을 때에만 해당 코드를 실행케 하는 코드입니다.
- if( Foo *pFoo = new Foo ) {
- // TODO : code is here
- } else {
- // TODO : if not allocated..
- }
여기서 유의하여야 할 점은 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 |