목차
연산자 오버로딩
- 멤버 함수 방식 - 대입 연산자 오버로딩
- 전역 함수 방식
연산자 오버로딩
멤버와 전역 함수 방식 중 하나만 지원하는 연산자도 있으니 둘 다 알도록 한다.
1. 멤버 함수 방식
대입 연산자( a = b )는 멤버 함수 방식으로만 구현할 수 있다.
// 대입 연산자 x, 선언 및 초기화
int a = 0;
int b = 1;
// 대입 연산자
a = b;
class Exam
{
public:
Exam operator+(const Exam& e)
{
Exam exam;
exam.x = x + e.x; // Exam a 를 기준으로 한다.
exam.y = y + e.y;
return exam;
}
private:
int x;
int y;
};
int main()
{
Exam a;
Exam b;
Exam c = a + b;
Exam d = a.operator+(b);
}
멤버 함수처럼 class 내부에 구현하는 방식이다.
operator 뒤에 원하는 연산자를 붙여서 오버로딩한다. 그런데 인자는 왜 하나인지 궁금할 수 있다.
이는 main에서 정의한 a가 operator의 기준이 되고 b가 인자로 넘겨지기 때문이다.
따라서 operator+ 함수 내에 존재하는 멤버 변수 x와 y는 Exam a의 멤버 변수임을 알 수 있다.
주의할 점은 a가 클래스가 아닌 경우 멤버 함수 방식을 이용해서 연산할 수 없다.
class Exam
{
public:
Exam operator+(int e)
{
Exam exam;
exam.x = x + e;
exam.y = y + e;
return exam;
}
...
}
int main()
{
Exam a;
Exam b;
Exam c = a + 1;
Exam d = 1 + b; // error
}
이해를 돕기 위해서 새로운 함수를 생성했다.
1 + b로 연산자 오버로딩 함수를 사용할 수 없다고 나올 것이다.
왜냐하면 멤버 함수 방식은 왼쪽 " 클래스 " 를 기준으로 연산하기 때문이다. 문법인 것 같다.
대입 연산자 오버로딩
class Exam
{
// 1
void operator=(int i)
{
x = i;
y = i;
}
// 2
Exam& operator=(int i)
{
x = i;
y = i;
return *this; // Exam* this = 자신의 주소;
}
...
};
int main()
{
Exam a;
Exam b;
a = 5; // 1
Exam c;
c = (b = 3); // 2
}
대입 연산자를 사용할 때, 선언 및 초기화와 헷갈릴 수 있으니 주의하자.
2. 전역 함수 방식
모든 피연산자를 인자로 받는다.
class Exam
{
public:
friend Exam operator+(int a, const Exam& b);
...
};
Exam operator+(int a, const Exam& b)
{
Exam exam;
exam.x = b.x + a; // friend를 사용하지 않으면, x와 y에 접근할 수 없다.
exam.y = b.y + a;
return exam;
}
이렇게 구현하면 멤버 함수 방식에서 성공하지 못했던 1 + b를 빌드할 수 있게 된다.
여기서 접근 제어 지시자인 friend를 사용해야 클래스 밖에서 Exam의 멤버 변수를 사용할 수 있게 된다.
즉, friend를 붙여서 클래스 내부에 선언하고, 구현은 클래스 외부에 하는 것이다.
'프로그래머 > CPP_메모' 카테고리의 다른 글
Uniform Initialization (0) | 2023.05.04 |
---|---|
모듈러 연산( modular, 나머지 ) (0) | 2022.04.21 |
c++ 배열 정리 (0) | 2022.03.21 |
c++ 참조 정리 (0) | 2022.03.20 |
c++ 포인터 정리 (0) | 2022.03.20 |