Computing

[C++] Operator Overloading에 대해 알아보기

ysk1m 2025. 4. 7. 20:00

Operator

흔히 아는 +,-,==,>, < 수학적/논리적 연산을 말한다.

각 class에 따라 operator를 redefine 할 수 있고 이것을 operator overloading이라한다.

custom type에 맞게 tailor를 할 수 있다.

 

피연산자, 반환 값을 결정해야 하고 그것에 맞춰 구현하는 function의 형태이다. 

사실 convention과 expectation을 맞춰서 function꼴로 만들어야 하는데 사실상 제약은 없다.

그래도.. convention에 맞춰서 해주면 좋다고 한다.(rule이니깐)

[] Subscript Operator 

 

  • Purpose: v [i]는 v의 i번째 element에 접근하는 것을 목표로 한다.
  • Syntax: 보다시피 입력으로 int index를 넣어주고 T& reference를 반환해 준다. reference가 아니었으면 index의 값을 진짜 copy 해서 반환했을 거다. 근데 reference로 하는 게 좀 더 계산한 때 좋으니깐 저렇게 설정한 듯하다.

+Addition Operator

  • Purpose: element wise sum을 수행한다.
  •  Syntax: operator+로 정의하여 사용하는데 오른쪽에서 피연산자를 받는다. 이 경우는 arithmetic 연산으로 새로운 object를 출력한다. 따라서 reference값이 아닌 바로 copy 값을 출력한다.

 

+=Addition Assignment Operator

  • Purpose: v += v는 v에 v를 element wise로 더하라는 것이다. add와 비슷하게 오른쪽에 있는 게 입력으로 들어간다.
  • 입력으로 reference값을 받음
  • add와 다르게 reference를 반환하기 때문에 chaining연산이 가능하다. 

여기서 rhs.array [i]나 rhs [i] 둘 다 동일한 거다.

 

++Prefix Increment Operator

in-place에서 1씩 증가시키는 method이다.

인자로는 아무것도 안 받고 array [i] 그 자리에서 하나씩 증가시킨다.

이 연산도 동일하게 reference를 반환한다.

 

++Postfix Increment Operator

operator++에 있는 int는 단지 Prefix operator와 구분하기 위한 것이다.

 

temp에 업데이트되기 전 상태를 보관하고 내부적으로 1씩 증가하게 한다.

이후 temp를 출력한다.

temp는 reference가 아닌 original object의 copy이다.

<<insertion operator

v<<e는

새로운 element e를 v에 append 하는 연산이다.

입력으로 literal(고정된 값)을 받으려면 항상 const를 선언해야 한다.

const를 통해 literal이 바뀌지 않는다고 보장해야 하기 때문이다.

 

reference을 반환하기 때문에 chaining이 가능하다.

==Equality Operator

같은 element가 있는지 확인해서 반환하는 것이다.

왼쪽이 호출을 당하고 오른쪽이 피연사자로 들어간다.

같은 type이 들어와야 하고 if로 size가 다르면 그냥 False이다.

 

return으로 bool을 반환한다.

 

bool Operator

  • Purpose: 어떤 v가 있을 때 이게 false인지 true인지 확인하는 것

Simplevector to bool으로 할 때 어떻게 되는지 보느게 저것을 하는 것임

 

if(vec1)이면 compiler가 스스로 vec1을 type conversion을 시도한다.

왜냐하면 vec1이 conditional statements에 있기 때문이다.

그럴 때 저 operator를 보고 type conversion을 해서 이용한다

Operator Overloading as Non-member function

지금까지는 class안에서 method로 정의했다

그런데 이렇게 안 하고 global scope에서 해도 된다.

지금 보면 왼쪽 오른쪽이 피연산자로 들어가고 operator앞에 ::와 같이 scope을 나타내는 것이 생략되었다.

benefit

class 그 자체를 고칠 필요 없이 원하는 method를 추가해서 class에 그 동작을 구현할 수 있다.

예를 들어 string 같은 건 고치기 힘든데 non member function을 이용하면 원하는 method를 구현할 수 있다.

member function과 Non member function이 동시에 있을 경우는 member function이 우선 적용된다.