title: “C++ 11. 연산자 중복(오버로딩)” categories:

  • CspecialCharspecialChar

    #C++ 11. 연산자 중복(오버로딩) : 네이버 블로그

연산자 중복(재정의)/오버로딩

연산자 중복은 연산자를 재정의해 사용자 지정 연산자를 만든다는 뜻이다

c++에서는 클래스에 연산자 중복을 사용하여 클래스의 연산자를 만들 수 있다

연산자 중복은 operator 함수를 사용하게 된다

리턴타입 operator 연산자(매개변수리스트);

의 형식으로 선언된다

클래스의 연산자 중복을 하는 경우는 2가지가 있다

  1. 클래스 내부에서 연산자 중복 맴버를 가지는 경우

  2. 클래스 외부에서 프랜드로 내부 데이터에 접근해 연산자 중복을 하는 경우

먼저 1. 클래스 맴버로 연산자 중복에 대해 알아보겠다

#include
using namespace std;
class xy {
 int x, y;
public:
 xy(int x, int y) {
 this->x = x;
 this->y = y;
 }
 void showxy() {
 cout << this->x <y << endl;
 }
 xy operator+(xy A) {
 xy R(0, 0);
 R.x = this->x + A.x;
 R.y = this->y + A.y;
 return R;
 }
};
int main() {
 xy A(1, 1);
 xy B(2, 2);
 xy C(0, 0);
 C = A + B;
 C.showxy();
}

한줄씩 가보자

일단 class xy가 정의되어 있다

xy는 xy 값을 가지고 있으며

show는 xy값을 출력한다

중요한 xy operator+(xy A)은

xy로 리턴하고 +연산자를 통해 오른쪽 피연산자가 A로 전달된다

이후 메인에서

C=A+B;에서 A+를 통해 재정의된 연산자가 실행되고

A+뒤에 있는 피연산자 B가

클래스 내부에 있는 A로 들어간다(xy operator+(xy A)에서 A)

중요한 점은 A에서 실행이 되었기 때문에 R.x=this->x+A.x;이 된다

조금 혯갈리게 됬는데 어쨋거다 뒤에 오는 얘가 피연산자고 앞에 있는얘가 operator를 실행하는것을 주의해야 한다

#include
using namespace std;
class xy {
 int x, y;
public:
 xy(int x, int y) {
 this->x = x;
 this->y = y;
 }
 void showxy() {
 cout << this->x <y << endl;
 }
 void operator!() {
 xy R(0, 0);
 if (x == 1)
 cout << "x=1"<<endl;
 if (y == 1) {
 cout << "y=1"<<endl;
 }

 }
};
int main() {
 xy a(1, 1);
 !a;
}

위 코드는 피연산자가 하나인 중복 연산자이다

operator! 을 통해 x=1,y=1이면 출력한다

main 안애서 연산자 실행은 !a를 통해 실행된다

주의할점은 피연산자가 자신만 있을 경우 연산자를 쓴 후 뒤에 객체가 온다( !a )

마찬가지로 다른 연산자를 사용하더라도 연산자가 앞에 온다(++a,–a,!@#a)

그럼 연산자를 뒤로 보내기 위해서는 어떻게 해야 할까?

바로 피연산자에 (int)를 추가하면 된다

void operator++(int)

이렇게 하면 a++를 사용할 수 있다

int는 매개변수로 int형을 전달한다는 것이 아닌 전위/후위 연산자를 구분하기 위함이다

(시험에 나올거같다ㅋㅋ)

잊지말자 operator++(int) !

그럼 첫번째 방법 클래스 내에 함수를 추가해 연산자 중복을 했고

두번째 방법. 프랜드로 외부 함수가 객체 내에 접근해 연산한다!

이해가 잘 안가려나?

음… 일단 아래 코드를 보자

#include
using namespace std;
class xy {
 int x, y;
public:
 xy(int x, int y) {
 this->x = x;
 this->y = y;
 }
 void showxy() {
 cout << this->x <y << endl;
 }
 friend xy operator+(xy a, xy b);
};
xy operator+(xy a, xy b) {
 xy c(0, 0);
 c.x = a.x + b.x;
 c.y = a.y + b.y;
 return c;
}
int main() {
 xy a(1, 1);
 xy b(2, 2);
 xy c(0, 0);
 c = a + b;
 c.showxy();
}

무엇이 달라졌는지 알겠는가?

friend xy operator+(xy a, xy b); 가 들어갔는데 +자체가 함수 이름이 되어

외부에서 xy operator+(xy a, xy b)를 구현할 수 있다

즉 operator+ 자체가 함수 이름이 되는 것이다

그리고 프랜드로 operator+는 함수 내부 맴버에 접근할 수 있

#include
using namespace std;
class xy {
 int x, y;
public:
 xy(int x, int y) {
 this->x = x;
 this->y = y;
 }
 void showxy() {
 cout << this->x <y << endl;
 }
 friend void operator!(xy A);
};
void operator!(xy A) {
 if (A.x == 1)
 cout << "x=1" << endl;
 if (A.y == 1)
 cout << "y=1" << endl;
}
int main() {
 xy a(1, 1);
 !a;
}

무엇을 설명하려 하는지 알겠는가?

이번엔 operator!를 사용하고 매개 변수는 A이다

이후 메인 안에서는 !a를 이용해 operator를 실행시킨다

그럼 마찬가지로 a++처럼 연산자를 뒤로 보내기 위해서는 어떻게 해야 할까?

마찬가지로 (int)를 피연산자로 추가해주면 된다

#include
using namespace std;
class xy {
 int x, y;
public:
 xy(int x, int y) {
 this->x = x;
 this->y = y;
 }
 void showxy() {
 cout << this->x <y << endl;
 }
 friend void operator++(xy A,int x);
};
void operator++(xy A,int x) {
 if (A.x == 1)
 cout << "x=1" << endl;
 if (A.y == 1)
 cout << "y=1" << endl;
}
int main() {
 xy a(1, 1);
 a++;
}

지금 와서 알게되었는데 (int x)를 사용하여 연산자를 뒤로 사용하게 되면 ++나 –만을 연산자로 사용해야 한다

!,==이런건 안되는 것 같다. 아마 a++,a–들만을 위한 (int)같다

업데이트: