@ 16. 1 ~ 17. 1/Effective C++

항목 10 : 대입 연산자는 *this의 참조자를 반환한다

namoeye 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인데 삭제하고 복사할것도 자기것이라면..? 복사전에 삭제했으니 없다)