연산자 재정의는 크게 두가지 방법이 있다. 하나는 클래스 멤버 함수로 정의하는 것이고, 다른 하나는 전역 필드에서 정의하는 것이다.
LP_STR& LP_STR::operator ==(LP_STR& input_1, LP_STR& input_2)
LP_STR& operator ==(LP_STR& input_1, LP_STR& input_2)
하지만 멤버 함수로 정의해도 충분하며, 굳이 외부에서 접근할 이유가 없으므로 후자는 잘 없다.
또한 모든 연산자가 두가지로 되는 것은 아니다.
=, ->, (), [] 은 클래스 멤버함수로만 가능하다.
문법은 operator뒤에 연산자로 간단하나, ++ 연산자의 전위, 후위는 외워야 한다.
object operator++(); // 전위
object operator++(int);// 후위
연산자 재정의를 지우는 방법은 아래처럼 한다.
Window(const Window& win) = delete;
연산자 정의시 파라미터로 들어오는 객체는 소멸자가 발동된다.
obect1 + obect2;
가
object1.operator+(object2)
라는 사실을 염두에 두면 이해가 빠를 것이다.
아래는 임시 객체에 대한 예시이다.
pt1 + pt2 에 아무것도 대입하지 않았지만 자동으로 복사 생성자가 생성이 된다.
이것은 컴파일러가 임시 객체를 만들고, 그 객체에 operator+ 의 리턴 객체을 복사하기 때문이다.
이 객체는 그 줄이 끝나고 바로 소멸된다.
하지만 객체를 만들지 않고 return 에 바로 생성자를 넣으면 임시객체에 생성자가 적용된다.
임시객체인 것은 변함 없어서 그 줄이 끝나면 사라진다.
return에 생성자를 넣고
Point a = (pt1 + pt2);
이런 식으로 코드를 짜면 임시객체가 대입는 것이기 때문에 대입연산자가 발동된다.
Point a = Point(10, 10);
이런 식이 생성자가 호출되는 것과는 다른 것이다.
상속시 주의해야할 점은 다음과 같다.
클래스가 상속받았을 경우 생성자, 소멸자, 연산자 관련 함수는 상속되지 않는다.
그래서 상속받는 클래스의 복사연산자를 재정의 할 때에는 상위 클래스의 복사 생성자를 호출해야한다.
댓글 없음:
댓글 쓰기