1998.11.11 조경민

class foo{
public:
    foo(int xx = 0){ x = xx }
    int x;        
};

foo x;

x = x + 3;

이 가능하다 컴파일러는 3이라는 숫자를 객체 x와 맞추기 위해서
int 3을 생성자 파라미터를 갖는 임시적인 객체를 생성한후
객체간 디폴트 = 대입을 한다.
만일 int형이 아닌 long인생성자 파라미터의 클래스하의 임시객체 생성시는
int형인 3을 long으로 타이컨버전을 하고 객체를 만들게 된다.
만일 불행히도 임시적 객체를 만들기 위한 이런 알맞는 생성자 파라미터가
없는 객체에서는 에러가 난다.


TC의 경우
class foo{
static int num;
};


int foo::num = 0;

foo x;

void print_foo( foo temp)
{
    cout << foo.data ....
}

int main()
{
    foo da;
    
    print_foo( da );
}


결과는 foo 생성자가 main에서 생성될때 호출이 된다.  또한 생성자에서
foo:;num 증가해서 1이 된다.
다음은 print_foo함수 호출시 foo형 temp가 자체적으로 복사 생성자에
의해서 생성이 된다. 복사 생성자는 같은 자료형을 만들고
속 맴버 자료를 각각 대입하지만 문제는 생성자 호출을 하지 않으며
따라서 foo::num 도 증가 하지 않는다. 그러나 복사 생성자에 의한
생성은 나중 main이 끝날때 da 객체의 소멸자 호출후 복사 생성자에
의한 또다른 소멸자가 호출이 된다.

따라서 복사 생성자에 의한 이러한 오류를 막기위해서 복사생성자를
만들어 주면된다.

복사생성자의 원형
foo( const foo& temp)
{
    if( this == temp ) return *this;
    맴버 자료 전송
}

'KB > C/C++' 카테고리의 다른 글

비트 연산  (0) 2004.03.19
C&ASM  (0) 2004.03.19
변수와 함수의 선언 범위  (0) 2004.03.19
\f 와 \r의 차이점 double과 float의 차이점  (0) 2004.03.19
volatile  (0) 2004.03.19

+ Recent posts