C++에서 == 연산자 오버로드

Muhammad Husnain 2023년10월12일
  1. C++의 연산자 오버로딩
  2. C++에서 == 연산자 오버로드
  3. 클래스 계층에서 == 연산자 오버로드
C++에서 == 연산자 오버로드

이 기사에서는 연산자 오버로딩의 기본 사항에 대해 설명하고 클래스에서 == 연산자를 쉽게 구현하는 방법을 제공합니다.

C++의 연산자 오버로딩

연산자 오버로딩은 클래스 개체 및 구조체와 같은 사용자 정의 데이터 유형과 함께 사용될 때 연산자가 작동해야 하는 방식을 변경하는 것을 말합니다. 이는 해당 연산자를 사용하기 위해 호출되는 클래스의 멤버 함수와 같습니다.

예를 들어 Student라는 클래스가 있고 어떤 학생의 점수가 다른 학생보다 높은지 확인하려면 두 개체의 marks 데이터 멤버를 비교할 수 있는 > 연산자를 오버로드하고 결과를 반환합니다.

연산자 오버로딩 구문은 다음과 같습니다.

class className {
 public:
  returnType operator operatorSymbol([list of arguments]) {
    // definition
  }
};

operator는 연산자 오버로딩에 사용되는 키워드이며 이후 오버로드가 필요한 연산자의 기호를 지정합니다. int, char, float 등과 같은 기본 데이터 유형에 대해 연산자를 오버로드할 수 없음을 기억하십시오.

오버로드가 허용되지 않는 소수를 제외하고 거의 모든 연산자가 오버로드될 수 있습니다. 이러한 연산자에는 다음이 포함됩니다.

  • sizeof 연산자
  • typeid 연산자
  • 범위 해상도 (::)
  • 클래스 멤버 액세스 연산자 (.(점), .*(멤버 연산자에 대한 포인터)
  • 조건부 연산자 (?:)

C++에서 == 연산자 오버로드

==는 비교 연산자 분류에 속하는 같음 연산자이기도 하며 true 또는 false의 부울 결과를 반환합니다. 연산자의 좌변과 우변에 있는 두 피연산자가 서로 같은지 여부를 판별합니다.

클래스와 같은 사용자 정의 데이터 유형의 경우 이 연산자를 오버로드하여 클래스의 두 개체를 비교하여 두 개체의 모든 데이터 멤버가 동일한지 여부를 확인할 수 있습니다.

다음 데이터 멤버가 있는 Employee 클래스를 고려하십시오.

class Employee {
 private:
  string name;
  int salary;
};

이 클래스에서 == 연산자를 오버로드하여 두 직원의 객체’가 서로 동일한지 여부를 확인할 수 있습니다. 이 기능은 다음과 같이 구현할 수 있습니다.

bool operator==(const Employee &emp) {
  if (name == emp.name && salary == emp.salary) return true;
  return false;
}

이제 우리는 그것들을 모두 합쳐 완전한 수업을 만들 수 있습니다.

#include <iostream>
#include <string>
using namespace std;

class Employee {
 private:
  string name;
  int salary;

 public:
  Employee(string n, int s) {
    name = n;
    salary = s;
  }
  bool operator==(const Employee &emp) {
    if (name == emp.name && salary == emp.salary) return true;
    return false;
  }
};
int main() {
  Employee e1("David", 1000);
  Employee e2("David", 1000);
  if (e1 == e2)
    cout << "Equal" << endl;
  else
    cout << "Not Equal" << endl;
}

출력:

Equal

클래스 계층에서 == 연산자 오버로드

일부 클래스는 상위 클래스이고 일부는 하위 클래스인 것처럼 여러 클래스가 있는 경우 모든 하위 클래스와 상위 클래스에서 연산자 함수를 구현해야 합니다. 예를 들어, A 클래스가 있고 == 연산자를 구현하는 경우 이 오버로드된 연산자는 모든 하위 클래스에서 사용할 수 있습니다.

class A {
 public:
  int foo;
  bool operator==(const A &a) { return foo == a.foo; }
};

이제 A의 하위 클래스인 B라는 또 다른 클래스가 있습니다.

class B : public A {
 public:
  int bar;
};

이 클래스에서 == 연산자를 구현하지 않으면 기본 클래스의 연산자 함수를 호출하지만, 문제는 기본 클래스가 B 클래스의 데이터 멤버만 비교하지 않고 자체 데이터 멤버만 비교한다는 것이다. 따라서, 우리는 또한 어린이 클래스에 연산자를 구현해야 합니다.

그 구현 후에 기본 클래스 구현은 명시적으로 호출할 때까지 호출되지 않습니다. 따라서 기본 클래스의 데이터 멤버를 비교하기 위해 해당 함수를 명시적으로 호출합니다.

이는 아래 코드 스니펫에 나와 있습니다.

class B : public A {
 public:
  int bar;
  bool operator==(const B &b) {
    if (!A::operator==(static_cast<const A &>(b))) {
      return false;
    }
    return bar == b.bar;
  }
};

드라이버 기능은 다음과 같습니다.

int main() {
  B b;
  b.bar = 2;
  b.foo = 1;
  B b2;
  b2.bar = 2;
  b2.foo = 1;
  if (b == b2) {
    cout << "Equal" << endl;
  }
}

출력:

Equal
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

관련 문장 - C++ Operator