업데이트:

태그: ,

카테고리:



REF : 윤성우의 열혈 C++

연산자 오버로딩

연산자 오버로딩을 통해 연산자의 기본기능 이외에 다른 기능을 추가할 수 있다.

  • C++이 제시하는 언어의 패러다임은, 객체도 완벽히 기본 자료형처럼 다룰 수 있게한다.이다.
  • 객체를 이루는 요소는 멤버변수, 함수이다.
  • 연산자 오버로딩을 통해 객체간 연산의 행동을 정의해줘야한다.
  • +연산자 오버로딩은 컴파일 타임에 .opeartor+로 해석된다.
  • 멤버함수에 의한 연산자 오버로딩전역함수에 의한 연산자 오버로딩보다 우선순위가 높다.


오버로딩 규칙

  1. 오버로딩이 불가능한 연산자

c++의 문법 규칙을 유지하기위해 아래 연산자는 오버로딩이 불가능.

.					멤버접근 연산자
.*					멤버 포인터 연산자
::					범위지정 연산자
?:					조건 연산자(3 연산자)
sizeof				바이트 단위 크기 계산
typeid				RTTI 관련 연산자
static_cast			형변환 연산자
dynamic_cast		형변환 연산자
const_cast			형변환 연산자
reinterpret_cast	형변환 연산자


  1. 멤버함수 기반으로만 오버로딩이 가능한 경우

객체를 대상으로해야만 의미가 있는 연산자들

=	대입 연산자
()	함수 호출 연산자
[]	인덱스 연산자
->	멤버 접근을 위한 포인터 연산자



단항 연산자의 오버로딩

  • 증감연산자는 대표적인 단항연산자이다.
  • 단항연산자의 피연산자는 호출한 객체하나이다.
  • 단항연산자의 오버로딩은 2가지로 나뉜다.
    • 멤버함수에 의한 오버로딩

      객체의 멤버함수가 호출되는 형태이다.

        obj.operator++();
      
    • 전역함수에 의한 오버로딩

      전역함수는 피연산자가 모두 인자로 전달된다.

        operator++(obj);
      
  • 어떤 함수에 의한 오버로딩이든, ++(++num)같은 연산을 하기 위해선 단항연산자도 참조값을 반환해야한다.


전위연산, 후위연산의 구분

C++에서는 전위연산 후위연산의 구분 규칙을 아래와 같이 하고있다.

++pos -> operator++();
pos++ -> operator(++)(int);

--pos -> operator--();
pos-- -> operator(--)(int);
  • int는 키워드이지 매개변수가 아니다.
  • 후위증가의 효과를 나타내기 위해선 피연산된 객체를 변화시키되 복사된 const 임시객체를 리턴해야한다.


C++에서의 후위연산

C++에서는 단일 자료형에 대해 연속적인 후위연산이 불가능하다.

int num = 100;
(num++)++;

이런 연산은 컴파일 에러를 발생시키는데, 위의 후위연산도
const 임시객체를 반환하므로, 첫번째 후위연산은 가능하나, 2번째는 const로 선언되어 불가능하다.



교환법칙 문제

곱셈과 덧셈은 A * B = B * A 와같은 교환법칙이 성립하는 연산이다.

Point operator*(int times)
{
	Point pos(xpos * times, ypos * times);
	return (pos);
}
  • 하지만 이처럼 곱셈 연산자를 오버로딩하면 교환법칙을 구현할 수 없다.
  • 교환법칙이 성립하기 위해선 전역함수의 형태로 오버로딩해야한다.
      Point operator*(int times, Point& ref)
      {
          Point pos(xpos * times, ypos * times);
          return (pos);
      }
      또는
      Point operator*(int times, Point& ref)
      {
          return (ref * times);
      }
    



입출력 오버로딩

  • iostream 으로 사용하는 std::cin, std::cout, std::endl모두 객체이다.
  • 이 객체들은 각각 «, » 등 연산자에 대해 오버로딩되어있다.
  • 이 연산자 오버로딩들은 연속된 출력, 입력을 위해 출력이후 객체 자신의 참조값을 리턴하도록 되어있다.

객체를 출력가능하게끔 하려면 이 연산자들을 오버로딩해야한다.
단, 이 연산자를 오버로딩하는 주체를 잘 알아야한다.
객체의 출력을 오버로딩하기 위해선 출력하는 객체인 std::cout를 오버로딩해야한다.

  • 멤버함수에 의한 오버로딩을 하려면 클래스를 직접 수정해야하지만, 이는 불가능하다.
  • 따라서 전역함수에 의한 오버로딩만 가능하다.

댓글남기기