written by yechoi

[C++] 복사 생성자 복사 대입 연산자 차이 본문

Born 2 Code/C, C++

[C++] 복사 생성자 복사 대입 연산자 차이

yechoi 2021. 2. 5. 11:21
반응형

복사 생성자는 '초기화', 복사 대입 연산자는 '할당'을 하자

복사 생성자는 생성과 동시에 초기화가 일어나야 한다.

ClapTrap::ClapTrap(const ClapTrap & ref)
    : _name(name)
{
}

 

반면 대입연산자는 초기화가 모두 일어난 후에 대입을 하는 것이다.

ClapTrap& ClapTrap::operator=(const ClapTrap & ref)
{
    _name = ref._name;
    return (*this);
}

 

때문에 아래처럼 복사 대입 연산자를 만들어 두고 이를 복사 생성자에 활용하는 건 말이 안된다. 복사 생성자는 생성과 동시에 초기화를 해야하는데, 내부에서 할당연산자를 사용해버리면 초기화를 한 후에 대입을 해버리는 꼴이 된다.

ClapTrap::ClapTrap(const ClapTrap & ref)
{
    *this = ref;
}

ClapTrap& ClapTrap::operator=(const ClapTrap & ref)
{
    _name = ref._name;
    return (*this);
}

 

반대도 마찬가지다. 복사 대입 연산자는 이미 존재하는 객체에 값을 대입하는 것인데, 여기서 복사 생성자를 호출해버리면 이미 버젓이 잇는 객체를 생성하는 꼴이 돼버린다.

 

복사 생성자와 복사 대입 연산자의 코드가 겹친다면, 양쪽에서 겹치는 부분은 별도의 멤버 함수에 분리해 놓고 이 함수를 호출할 수는 있다. 이런 용도의 함수는 대개 private 멤버로 두고, init 어쩌고 하는 이름을 가진다.

 

출처: Effective C++ 항목12 '객체의 모든 부분을 빠짐없이 복사하자'

반응형