연산자 오버로딩 (operator overloading)

연산자 오버로딩
: 기존 정의된 연산을 사용자가 정의한 클래스에 오버로드 기능을 이용하여 새로 정의한 후 클래스끼리 연산이 가능하게 하는 것

  1. 멤버 변수로 정의하기
class Edge {
public:
    int node[2];
    int distance;
    
    Edge(int a,int b,int distance){
        this->node[0] = a;
        this->node[1] = b;
        this->distance = distance;
    }
  
  	int operator+(Edge &edge);	
};

int Edge::operator+(Edge &edge){
    return this->distance + edge.distance;
}
  1. 전역변수로 정의하기
class Edge {
public:
    int node[2];
    int distance;
    
    Edge(int a,int b,int distance){
        this->node[0] = a;
        this->node[1] = b;
        this->distance = distance;
    }
};

int operator+(Edge &edge1, Edge &edge2){
    return edge1.distance + edge2.distance;
}

특별한 상황이 아니면 연산자 오버로딩할때 레퍼런스로 선언해 복사 횟수를 줄인다! (단 사칙연산 제외)

int '&'operator=(int '&'rhs)

전위 연산자와 후위연산자 구현하기

Fixed &Fixed::operator++(void){
	this->value += 1;
	return (*this);
} // 전위 연산자 : 참조값으로 받아와 자기 자신을 리턴

const Fixed Fixed::operator++(int){
	Fixed temp = (*this);

	this->value += 1;
	return (temp);
} // 후위 연산자 : 임시저장 한 값을 리턴
	c++컴파일러 특성상 연속된 후위연산을 하지 않기 때문에 const로 작성

int main()
{
    int num = 0;
 
    ++(++num);
    // ++num은 1을 참조하는 lvalue를 리턴한다.
    //따라서 ++(1을 참조하는 lvalue)는 2를 참조하는 lvalue를 리턴한다.
    (num++)++;
   //num++는 1이라는 rvalue를 리턴한다.
   //따라서 1++는 피연산자가 상수(rvalue)이므로 컴파일러는 에러를 발생시킨다.
    return 0;
}

전위 연산자는 기존 값으로 반환하고 후위연산자는 기존값을 임시 저장한 후 증감한 후 임시저장 값을 반환한다. >> 전위연산자의 속도가 더빠르다
후위 연산자를 오버로딩 하기 위해서 매개 변수로 int를 넘기는데 이때 int는 특별한 의미를 가지는 것이 아니라 전위/후위 연산자의 구분을 위한 것이다. 매개변수를 사용하지 않으면 경고 메시지를 띄우는 컴파일러도있기 때문에, 아예 이름이 없는 매개변수를 사용합니다.


사칙 연산의 경우 레퍼런스의 리턴을 하면 오류가 발생할 수 있음

a = b + c + b의 경우
a = (b.plus(c)).plus(b)로
b에 c를 더하고 다시 b를 더하게 되는데 레퍼런스로 할경우
b = (b+c)로 먼저 값이 변경되어 실제로 b + c + ( b + c )가 된다

좋은 웹페이지 즐겨찾기