언어 자료구조 알고리즘/Escort C++

[C++] 클래스에 연산자 중복 정의

언제나휴일 2016. 4. 15. 15:02
반응형

7.1.2 클래스에 연산자 중복 정의

 

 연산자 중복 정의는 전역과 클래스에서 할 수 있다고 하였습니다. 이번에는 클래스에서 연산자 중복 정의를 하는 방법에 관하서 얘기해 보도록 합시다.

 

 클래스에서 연산자 중복 정의를 할 때에는 클래스 내에 어떠한 연산에 대해서 중복 정의할 것인지 캡슐화하고 이에 대해 구현을 해야 합니다. 이때, 전역에서 정의하는 것과 다른 점은 피연산자 중에 좌항은 해당 클래스 형식으로 약속된다는 점입니다. 그리고 캡슐화할 때 자신의 형식에 대한 피연산자는 입력 매개변수 리스트에서 생략합니다.

 

Stu.h

#pragma once

#include <iostream>

#include <string>

using namespace std;

 

class Stu

{

    const int num;

    string name;   

public:

    Stu(int _num,string _name);

    int GetNum()const;

    bool operator == (int num)const;

};

 

bool operator == (int num, const Stu &stu);

 

 Stu.h의 예제 코드와 같이 Stu 클래스 내에서 연산자 중복 정의를 할 때에는 입력 인자 중에 좌항은 Stu형식이 오는 것은 이미 언어에서 약속되어 있기 때문에 개발자는 입력 매개변수 리스트에 명시하지 않습니다.

 

Stu.cpp

#include "Stu.h"

Stu::Stu(int _num,string _name):num(_num)

{

    name = _name;

}

int Stu::GetNum()const

{

    return num;

}

bool Stu::operator == (int num)const

{

    return this->num == num;

}

bool operator == (int num, const Stu &stu)

{

    return stu == num;

}

 

 Stu.cpp 소스 파일에는 클래스 정의에서 캡슐화를 약속한 연산자 중복 정의 함수를 구현해야 할 것입니다. 이 같은 경우에 동일한 연산자에 대한 중복 정의를 전역에서도 구현할 경우 위처럼 클래스에 중복 정의한 연산을 사용하여 구현을 하십시오. 그러면 논리적 버그가 있을 때 클래스 내에 중복 정의한 코드만 수정하더라도 자연스럽게 전역에 정의한 것에도 반영됩니다.

 

bool Stu::operator == (int num)const

{

         return this->num == num;

}

bool operator == (int num, const Stu &stu)

{

         return stu == num;

}

 

 위와 같이 교환 법칙이 성립하는 연산을 중복 정의할 경우에 클래스와 전역에 모두 정의하여 사용하는 개발자가 유연하게 사용할 수 있게 하세요. 또한, 지금과 같이 == 연산에 대해 중복 정의를 했다면 사용하는 개발자가 이와 연관된 연산(!=)도 사용이 가능할 것이라 유추할 수 있는 것이 있다면 이에 대해서도 구현해 주는 것이 효과적일 것입니다. 참고로 C#언어에서는 이 같은 경우에 컴파일러가 연관되는 연산에 대해 중복 정의를 같이 하지 않으면 오류를 발생시킵니다. C++언어에서는 컴파일러에서 오류를 발생하지 않으므로 개발자가 신중하게 구현하여야 합니다.


7장 산자 의 Part1

7장 산자 의 Part2

(모든 동영상 강의는 무료입니다.)

반응형