728x90
반응형
a+b가 있다면 a+=b도 같은 의미인 것이 좋다.
즉 두 대상 사이에 이루어지는 산술 연산자의 경우 같은 효과를 가지는 할당 연산자도 제공해야만 중복을 피하고 효율을 극대화할 수 있다. 일반적으로 바이너리 연산자 @가 있다면 a@=b나 a=a@b와 같은 할당 연산 버전도 준비하고, 같은 의미를 가지게끔 해주는 것이 좋다. 이를 위해서는 다음과 같이 @ 연산을 @= 방식으로 만들면 된다.
T& T::operator@=(const T&) {
// .... 구현 내용 ...
return *this;
}
T operator@(const T& lhs, const T& rhs) {
T temp(lhs);
return temp @=rhs;
}
두 함수의 기능은 같다고 볼 수 있다. 할당 형식은 실제 작업을 수행하고 인자를 리턴 하지만, 할당 형식이 아닌 버전에서는 lhs라는 임시 값을 만들고, 할당 형식을 호출하여 값을 변형한 후에 리턴하는 차이점이 있을 뿐이다.
operator@ 는 멤버 함수가 아니기 때문에 연산이 이루어지는 양쪽 대상에 대해 간접적인 변환을 할 수 있다는 점에 주의하자. 예를 들어 char 타입을 받아들이는 string 클래스를 정의했다고 하면, operator+(const string&, const string&)를 비멤버 함수로 만들면 char + string과 string + char 모두 가능하게 된다는 의미이다.
물론 멤버 버전의 string::operator+(const string&)라면 두 번째 방식만이 가능할 것이다.
operator@= 역시 가능하다면 비멤버 함수로 만드는 편이 좋으며, 모든 비멤버 연산자들은 같은 네임스페이스내에 넣어 호출자가 편하게 사용할 수 있도록 하고, 이름 조회가 필요 없게끔 해주면 더욱 좋을 것이다.
728x90
반응형
'소프트웨어 공부 > 프로그래밍' 카테고리의 다른 글
만들고 있는 클래스가 무엇인지 확실히 하라 (0) | 2021.04.20 |
---|---|
간접적인 타입 변환을 피하기 위해 오버로딩을 활용하라 (0) | 2021.04.20 |
값, (스마트) 포인터, 참조 중 적절한 방식으로 인자를 얻어라 (0) | 2021.04.20 |
헤더 파일은 충분히 완성된 형태로 만들어라. (0) | 2021.04.20 |
정의의 의존성과 순환 의존성을 최소화하라 (0) | 2021.04.20 |