2023. 10. 31. 20:19ㆍSWLearning
클래스간 연산을 더하는 로직에서 대부분 클래스 오퍼레이션을 별도로 선언하여 사용하게 된다.
이러한 방식은 직관성을 해치므로 이를 타파하기 위해 도입된 개념이 바로 연산자 오버로딩이다.
사용 방식은 반환형 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여야함. (조작 불능)
반대로 전위 연산자는 재전위연산 가능케해야 함.