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