C++언어 공부/개념 공부

2024.02.02 C++ 언어 공부 8일 차 (오퍼레이터)

코딩입문시작 2024. 2. 8. 12:24

operator overloading : 하나의 연산자를 여러 의미로 사용할 수 있게 하는 것이다. C++ 에서는 연산자 오버로딩을 사용자 정의 타입까지 확장할 수 있으며, 클래스도 하나의 타입임을 확실히 보여준다. 

 

operator function (연산자 함수) : C++ 에서는 연산자를 오버로딩하기 위해서 연산자 함수라는 것을 사용한다.

연산자 함수는 operator 키워드를 사용하여 연산자를 오버로딩한다. 오버로딩할 연산자는 적법한 C++ 연산자이며, operator 키워드와 공백 없이 연결되어 표시해야 한다. (직접 해보니 공백 ? 상관 없는 거 같은데 ...)

 

오버로딩 제약 사항

  • 전혀 새로운 연산자를 정의할 수 없다. (원래 있던 연산자)
  • 기본 타입을 다루는 연산자의 의미는 재정의할 수 없으며, 따라서 오버로딩된 연산자의 피연산자 중 하나는 반드시 사용자 정의 타입이어야 한다.
  • 오버로딩된 연산자는 기본 타입을 다루는 경우에 적용되는 피연산자의 수, 우선순위 및 그룹화를 준수해야 한다.
  • 오버로딩된 연산자는 디폴트 인수를 사용할 수 없다.

 

참고 사이트 : C++ 연산자 오버로딩 : 네이버 블로그 (naver.com)

참고 사이트 : [C++] operator overloading(연산자 오버로딩) (tistory.com)

 

C++ 연산자 오버로딩

함수의 오버로딩이란 같은 이름의 함수를 다른 역할로 쓸 수 있도록 이름의 중복을 허용한다는 의미였다. ...

blog.naver.com

 

#include <iostream>

using namespace std;

class Numbers {
private:
  int num1, num2;

public:
  // 기본 생성자
  Numbers() { ; }

  // 생성자
  Numbers(int num1, int num2) : num1(num1), num2(num2) { ; }

  void ShowNumbers() { // 객체 정보를 확인하는 메소드
    cout << "num1 : " << num1 << ", num2 : " << num2 << endl;
  }

  int operator + (int num) {
    return num2 + num;
  }

  Numbers operator + (Numbers ref)  {
    int num1;
    int num2;
    num1 = this->num1 + ref.num1;
    num2 = this->num2 + ref.num2;
   
    Numbers ob(num1, num2);
    return ob;
  }

  // 비교 연산자
  bool operator < (Numbers ref)  {
    return (num1 + num2) < (ref.num1 + ref.num2);
  }

  // 비교 연산자
  bool operator > (Numbers ref) {
    return (num1 + num2) > (ref.num1 + ref.num2);
  }

  // == 를 구현해보자 [실습]
  // 객체와 정수를 비교해주는 친구로 오버로딩 하자!
  // 해당 객체의 두 번째 멤버변수와 매개변수로 넘어온 정수가 같다면
  // true 리턴, 아니면 false 리턴
  bool operator == (int num) {
    return num2 == num;
  }

  // += 연산자 재정의
  void operator += (int data) {
    num1 += data;
    num2 += data;
  }

  // 전위형
  Numbers operator++ () {
    ++num1;
    ++num2;
    return *this;
  }

  // 후위형
  Numbers operator++ (int temp) { // 전위형과 후위형을 구분하기 위해 매개변수를 하나 작성
    Numbers Temp = *this;
    num1++;
    num2++;
    return Temp;
  }
};

int main() {
  Numbers ob1(4, 9);

  // 피연산자 형식이 Numbers + int 라 안됨
  // 따로 만들어줘야한다.
  cout << ob1 + 5 << endl;

  Numbers ob2(1, 3);
  Numbers ob3 = ob1 + ob2;

  ob3.ShowNumbers();

  bool result1 = ob1 < ob2;
  cout << result1 << endl; // 출력 0

  bool result2 = ob1 > ob2;
  cout << result2 << endl; // 출력 1

  if (ob1 < ob2) {
    cout << "ob2 객체의 변수들의 합이 더 큽니다." << endl;
  }
  else {
    cout << "ob1 객체의 변수들의 합이 더 큽니다." << endl;
  }

  Numbers ob4(6, 9);
  if (ob4 == 5) {
    cout << "ob4 객체의 num2 변수와 값이 같습니다." << endl;
  }
  else {
    cout << "ob4 객체의 num2 변수와 값이 같지 않습니다." << endl;
  }

  ob1.ShowNumbers();
  ob1 += 7;
  ob1.ShowNumbers();

  ob3 = ++ob2;
  ob3.ShowNumbers();

  int num = 5;
  cout << num++ << endl;

  ob3 = ob2++;
  ob3.ShowNumbers();
  ob2.ShowNumbers();

  return 0;
}

 

 

증감 연산자 (전위형, 후위형)

  전위형 후위형
파라미터 void(없음)  int
리턴값 객체 자체 임시 객체
속도 빠름 느림