[디딤돌 C++] 47. 클래스에 연산자 중복 정의

이번에는 클래스 내부에 멤버 메서드로 연산자를 중복 정의하는 방법을 알아봅시다.

클래스 내부에 멤버 메서드로 연산자를 중복 정의할 때도 메서드의 이름은 operator 키워드에 연산 기호로 나타냅니다. 대신 피연산자 중에서 좌항에 오는 자기 자신은 입력 매개 변수 리스트에 열거하지 않습니다. 주의할 점은 사용하는 곳에서 피연산자의 좌항에 클래스 형식이 올 때만 동작한다는 것입니다. 교환 법칙이 성립할 때는 우항에 클래스 형식이 올 때 수행할 수 있게 전역 연산자 중복 정의도 같이 하시기 바랍니다.

다음은 전역 연산자 중복 정의에서 다루었던 학생 클래스에 == 연산자 중복 정의했던 코드를 클래스 내부에 메서드로 연산자 중복 정의하는 코드입니다.

//Student.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Student
{
    string name;
    const int num;
public:
    Student(int num,string name);
    bool IsEqual(int num)const;
    void View()const;
    bool operator==(int num)const;
};
bool operator == (int num, const Student &stu);
//Student.cpp
#include "Student.h"
Student::Student(int num,string name):num(num)
{
    this->name = name;
}

bool Student::IsEqual(int num)const
{
    return this->num == num;
}
void Student::View()const
{
    cout<<"번호:"<<num<<" 이름:"<<name<<endl;
}
bool Student::operator == (int num)const
{
    return IsEqual(num);
}
bool operator == (int num, const Student &stu)
{
    return stu.IsEqual(num);
}
//Program.cpp
#include "Student.h"
int main()
{
    Student stu(3,"홍길동");
    int num;
    cout<<"번호:";
    cin>>num;
    if(stu == num) //멤버 메서드 operator == 를 호출
    {
        cout<<"학생 번호는 "<<num<<"입니다."<<endl;
    }
    else
    {
        cout<<"학생 번호는 "<<num<<"이 아닙니다."<<endl;
    }
    if(num == stu) //전역에 정의한 operator == 호출
    {
        cout<<"학생 번호는 "<<num<<"입니다."<<endl;
    }
    else
    {
        cout<<"학생 번호는 "<<num<<"이 아닙니다."<<endl;
    }
    stu.View();
    return 0;
}