소프트웨어 공부/프로그래밍

표준적인 형식의 산술 및 할당 연산자를 사용하라

야곰야곰+책벌레 2021. 4. 20. 14:50
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
반응형