연산자 오버로딩 (operator overloading)
연산자 오버로딩
: 기존 정의된 연산을 사용자가 정의한 클래스에 오버로드 기능을 이용하여 새로 정의한 후 클래스끼리 연산이 가능하게 하는 것
- 멤버 변수로 정의하기
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;
}
- 전역변수로 정의하기
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 )가 된다
Author And Source
이 문제에 관하여(연산자 오버로딩 (operator overloading)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hopark/연산자-오버로딩-operator-overloading저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)