본문 바로가기

C++

c++] 레퍼런스와 연산자 오버로딩(2)

(2) Operator Overloading

임의의 struct나 class를 사용할 때 operator를 써야할 상황이 있다. 예를 들어

struct Node {

int a;

int c;

};

Node a = {2,3};

Node b = {2,3};

Node c;


이 있다고 하자. 이 때, 'a와 b가 같은 것인가?''c에 a의 값을 저장하고 싶다' 두 상황을 '=='과 '='으로 표현하고 싶다.

이를 연산자 오버로딩을 통해 구현 해보자.


struct Node{

int a;

int b;

bool operator==(const Node& input)

{

return (a == input.a) && (b == input.b);

}

Node& operator=(const Node& input) //operator"표현식"(표현식의 입력) --> operator=(const Node& input)

{

a = input.a;

b = input.b;

return *this;

}

};


Node a = {2,3};

Node b = {2,3};

Node c;


if (a == b)

cout << "Yes" << endl;

c = a;

cout << "c의 a: " << c.a << "\tb: " << c.b << endl;


결과:


이 때!!

operator=(const ....)에서 const는 함수에서 입력에 영향을 주지 않겠다는 뜻이며

return *this는 

이 때, 다음과 같이 3번에서 복사가 일어나는 것을 볼 수 있다. 따라서 이 예제에서는 복사를 피하기 위해 

void operator=(const Node& input)

{

a=input.a;

b=input.b;

}

위와 같이 바꿀 수도 있다. 물론 복사가 필요한 경우에는 위와 같이 reference를 반환하게 함수를 작성해야 한다.


출처: https://stackoverflow.com/questions/14047191/overloading-operators-in-typedef-structs-c

       https://edykim.com/ko/post/c-operator-overloading-guidelines/