[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "
" 안전한 자원 관리를 위한 방법! "
- operator=을 구현할 때, 자기 대입이 일어나지 않도록 잘 처리하자!
- 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인해보자!
CMonster Monster; Monster = Monster;
- 자기 대입a[i] = a[j];
- i 와 j 가 같아진다면...?*px = *py;
- 가리키는 대상이 같다면...?
Widget& Widget::operator=(const Widget& rhs)
{
if(this == &rhs)
return *this;
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
- 자기 대입인지 검사 후 자기 대입이라면 아무 동작도 하지 않고 return.
❌ 문제점 : new Bitmap 시 예외가 발생한다면 삭제된 Bitmap을 가리키는 포인터가 생겨 다양한 문제를 일으킬 수 있음.
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb;
pb = new Bitmap(*rhs.pb);
delet pOrig;
return *this;
}
- 일치성 검사의 문제점 해결 가능.
- 그다지 효율적이지 못함.
[예시 1]
Widget& Widget::operator=(const Widget& rhs)
{
Widget temp(rhs);
swap(temp);
return *this;
}
[예시 2] // 값에 의한 전달을 통해 복사를 일으키는 방법
Widget& Widget::operator=(Widget rhs)
{
swap(rhs);
return *this;
}