HOWTO · C++

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

이것은 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