C++ : Operator Overloading

2023. 10. 31. 20:19SWLearning

클래스간 연산을 더하는 로직에서 대부분 클래스 오퍼레이션을 별도로 선언하여 사용하게 된다.

이러한 방식은 직관성을 해치므로 이를 타파하기 위해 도입된 개념이 바로 연산자 오버로딩이다.

 

사용 방식은 반환형 operator연산자(매개변수 리스트){ 연산자 동작 재정의 }로 수행하면 된다.

 

접근 방식은 클래스 멤버 함수로 오버로딩, 전역 함수로 오버로딩을 가능케 할 수 있다.

단, 전역 함수는 클래스 내부 friend 선언을 통해 멤버변수 접근을 허용해야 한다.

 

Point operator+(const Point& p1, const Point& p2){

 Point pt(p1.x+p2.x, p1.y+p2.y);

 return pt;

}

와 같이 오버로딩시 Point P3 = P1+P2; 가 가능하다.

 

아래는 연산자 오버로딩 제약조건이다.

#오버로딩 불가#

. 멤버 접근 연산자

.* 멤버 포인터 연산자

:: 범위 지정 연산자

?: 조건 연산자(3항 연산자)

 

#멤버함수의 형태로만 오버로딩이 가능#

= 대입 연산자

() 함수 호출 연산자

[] 배열 접근 연산자 (인덱스 연산자)

-> 멤버 접근을 위한 포인터 연산자

 

#주의사항#

본래 의도 벗어난 연산자 오버로딩 금지 -> 가독성 해침

연산자 우선순위는 변동X

매개변수 디폴트 값 설정 불가 : 함수 호출관계의 불분명

기본 타입(int...)은 컴파일러에게 혼동을 주므로 오버로딩 불가

 

단항 연산자에서 후위연산자는 const 선언을 통해 연산자를 재후위연산시킬 수 없게 막아야 함.

또한 전위 연산자와 구분위해 int를 붙여 전위연산자와 오버로딩 구분을 한다. (변수명 불필요)

마지막으로 리턴을 받는 변수도 const여야함. (조작 불능)

 

반대로 전위 연산자는 재전위연산 가능케해야 함.