2016년 3월 18일 금요일

[Effective C++] 항목 10 : 대입 연산자는 *this의 참조자를 반환하게 하자

Effective C++의 이번 항목 내용은 관례(Convention)에 대한 이야기 입니다. C++의 대입연산은 여러 개가 사슬처럼 엮일 수 있는 성질을 갖고 있습니다. 아래와 같이 말입니다.
  1. int x,y,z;  
  2. x = y = z = 15;  
 대입 연산이 가진 또 하나의 재미있는 특성은 바로 우측 연관(Right-associative) 연산이라는 점입니다. 즉, 위의 대입 연산 사슬은 다음과 같이 분석이 됩니다.

  1. x = (y = (z = 15)));  
 위 소스코드를 보면, 15가 z에 대입되고, 그 대입 연산의 결과가 y에 대입된후에, y에 대한 대입 연산의 결과가 x에 대입이 됩니다. 이렇게 대입 연산이 사슬처럼 엮일려면 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어 있기 때문일 것입니다. 따라서, C++에서의 연산자 재정의를 할 시에 이런 관례를 지켜주는 것이 좋습니다. "좌변 객체의 참조자를 반환하게 만들자"라는 관례는 대입형 연산자 말고 모든 형태의 대입 연산자에서도 지켜져야 할 것입니다. 
  1. class Convention{  
  2. public:  
  3.       
  4.     Convention& operator= (const Convention& con)  
  5.     {  
  6.         return *this;  
  7.     }  
  8.   
  9.     // +=, -=, *= 등에도 동일하게 지켜줘야 합니다.  
  10.     Convention& operator+= (const Convention& con)   
  11.     {  
  12.         return *this;  
  13.     }  
  14.   
  15.     //대입 연산자의 매개변수 타입이 일반적이지 않는 경우도 마찬가지죠.  
  16.     Convention& operator= (int con)  
  17.     {  
  18.         return *this;  
  19.     }  
  20. };  
 관례라는 것이 굳이 따르지 않아도 되긴 하지만, 표준 라이브러리에 속한 모든 타입에서도 이런 관례를 전부 따르고 있다는 점은 무시 못할 것입니다. 그냥 이것저것 따지지 말고 묻지도 말고 따르면 되는 것입니다.

 * 대입 연산자는 *this의 참조자를 반환하도록 만들자!!



댓글 없음:

댓글 쓰기

[Effective C++] 항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자.

인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별 최적화를 걸기가 용이해집니다. 인라인 함수의 아이디어는  함수 호출문을 그 함수의 본문으로 바꿔치기하자는 것  남발했다가는 코드의 크기가 커질 게 뻔하다. 인라인 함수로 부풀려진 ...