연산자 오버로딩

은수·2022년 5월 25일

cpp study

목록 보기
5/21

https://modoocode.com/202

연산자 오버로딩

기본연산자

  • +, -, *와 같은 산술 연산자
  • +=, -=와 같은 축약형 연산자
  • >=, ==와 같은 비교 연산자
  • &&, ||와 같은 논리 연산자
  • ->, *와 같은 멤버 선택 연산자
  • ++, -- 증감 연산자
  • [],()와 같은 배열 연산자와 함수 호출 연산자

연산자 오버로딩

이러한 기본 연산자들을 직접 사용자가 정의하는 것을 의미
이해하기 쉬운 사이트 : https://cho001.tistory.com/195

  • 기본 형식
(리턴 타입) operator(연산자) (연산자가 받는 인자)
  • 예시
// ==를 오버로딩하고 싶을 때, ==연산자는 언제나 결과 값이 bool이고, 인자로는 ==로 비교하는 것 하나만 받게 되므로 아래와 같이 함수 정의
bool operator==(MyString& str);
  • 제약사항
    • 전혀 새로운 연산자를 정의할 수 없음
      ex) 몫을 나타내기 위한 %% 라는 연산자를 새롭게 정의 불가능
    • 기본 타입을 다루는 연산자의 의미는 재정의할 수 없으며, 따라서 오버로딩된 연산자의 피연산자 중 하나는 반드시 사용자 정의 타입 이여야 함.
      ex) 두개의 double형에 대한 덧셈 연산자가 뺄셈을 수행하도록 오버로딩 할 수 없음
    • 오버로딩된 연산자는 기본 타입을 다루는 경우에 적용되는 피연산자의 수, 우선 순위 및 그룹화를 준수해야 함
      ex) 나눗셈 연산자는 이항 연산자이므로 단항 연산자로 오버로딩 할 수 없음

단항 연산자와 이항 연산자

Rational operator-();
Rational operator-(const Rational& secondRational) const;
  • 단항 연산자는 호출 객체 자신인 한 개의 피연산자에 대해서 연산하기 때문에 매개변수 가지지 않음
Rational operator<(const Rational& r1, const Rational& r2);
Rational Rational :: operator<(const Rational& r1, const Rational& r2) const;
  • 연산자 오버로딩은 클래스 내에 멤버 함수로 구현될 수도 있고, 클래스 밖의 비멤버 함수로도 구현할 수 있음

friend 키워드

클래수 내부에서 다른 클래스나 함수들을 friend로 정의할 수 있는데, friend로 정의된 클래스나 함수들은 원래 클래스의 private, protected으로 정의된 함수나 변수에 접근 가능

class A {
 private:
  void private_func() {}
  int private_num;

  // B 는 A 의 친구!
  friend class B;

  // func 은 A 의 친구!
  friend void func();
};

class B {
 public:
  void b() {
    A a;

    // 비록 private 함수의 필드들이지만 친구이기 때문에 접근 가능하다.
    a.private_func();
    a.private_num = 2;
  }
};

void func() {
  A a;

  // 비록 private 함수의 필드들이지만 위와 마찬가지로 친구이기 때문에 접근
  // 가능하다.
  a.private_func();
  a.private_num = 2;
}

int main() {}
  • B와 func을 A의 친구라고 선언 -> B와 func 안에서는 A의 private 멤버 함수와 멤버 변수에 접근 권한 부여
  • 다만, 일방향적이라 B는 A의 모든 private을 볼 수 있지만, B안에서 A를 friend로 지정하지 않는 이상 A는 B의 private 객체에 접근 불가능

C++ 스타일의 캐스팅

c++에서는 아래와 같은 4가지 캐스팅을 제공하고 있음

  • static_cast : 우리가 흔히 생각하는, 언어적 차원에서 지원하는 일반적인 타입 변환
  • const_cast : 객체의 상수성(const) 를 없애는 타입 변환. 쉽게 말해 const int 가 int 로 바뀜
  • dynamic_cast : 파생 클래스 사이에서의 다운 캐스팅
  • reinterpret_cast : 위험을 감수하고 하는 캐스팅으로 서로 관련이 없는 포인터들 사이의 캐스팅 등. 예를 들어 정수형 -> 포인터로 바꿀 수 있음 (or A를 가리키고 있는 포인터인데 C를 가리키도록 만들고 싶을 때)

보통 dynamic_cast를 많이 쓰고, dynamic_cast를 사용하기 힘든 상황에 reinterpret_cast를 사용!

사용법
(원하는 캐스팅 종류)<바꾸려는 타입>(무엇을 바꿀 것인가?)

0개의 댓글