-
항목 10 : 대입 연산자는 *this의 참조자를 반환한다@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 15. 22:15
x=(y=(z=15));
이렇게 대입연산이 사슬처럼 엮이려면 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어야 한다.
즉 z=15에서 z가 참조 반환되어 y=에 들어가고 y가 참조반환되어 x=에 들어간다.
즉 return *this;
operator=
operator+=
특히 operator=에서는 자기대입에 대한 처리가 빠지지 않도록 한다.
class B
{
public:
int num;
B()
{
num=0;
}
};class A
{
public:
B *num;
public:
A()
{
num=new B;
}
~A(){}//첫번째 방법 일치성 검사
A& operator=(const A& rhs)
{
if(this==&rhs)
{
return *this;
}
delete num;
num=new B(*rhs.num);
return *this;
}
};자기랑 같은지 비교후 같으면 아무것도 안함
//두번째 방법 문장순서조정
A& operator=(const A& rhs)
{
B *temp=num;
num=new B(*rhs.num);
delete temp;
return *this;
}원본을 복사해두고 복사해놓은 사본을 포인터가 가리키게 한 후 원본을 삭제
//세번째-1 방법 복사후 맞바꾸기
void swap(A &rhs); //*this 테이터 및 rhs의 데이터를 맞바꿈
A& operator=(const A& rhs)
{
A temp(rhs); //rhs의 데이터에 대해 사본을 하나 더 만듬
swap(temp); //*this의 데이터를 그 사본의 것과 맞 바꿈
return *this;
}//세번째-2 방법 복사후 맞바꾸기(C++의 장점을 살려)
값에 의한 전달 수행히 사본이 생긴다는 성질 이용
void swap(A &rhs); //*this 테이터 및 rhs의 데이터를 맞바꿈
A& operator=(const A rhs) //rhs는 &가 아니므로 사본이다.
{
swap(rhs); //*this의 데이터를 그 사본의 것과 맞 바꿈
return *this;
}int main()
{
A *ptr;
A *pty;
A a;
ptr=&a;
pty=&a;
*ptr=*pty;
getch();
return 0;
}같은객체인 경우 delete연산자가 *this객체와 rhs객체가 같이 적용된다.
(기존의 자기 num인데 삭제하고 복사할것도 자기것이라면..? 복사전에 삭제했으니 없다)
'@ 16. 1 ~ 17. 1 > Effective C++' 카테고리의 다른 글
항목 36 : 상속받은 비가상 함수를 파생클래스에서 재정의하지말것 (1) 2015.01.25 항목 35 : 가상 함수 대신 쓸 것들도 생각해 두는 자세를 .. (0) 2015.01.25 항목 9 : 객체 생성 및 소멸자에 절대로 가상 함수 호출 금지 (0) 2015.01.15 항목 7:가상 소멸자 (0) 2015.01.14 항목6 : 복사생성자 및 대입연산자 제한 (0) 2015.01.14