반응형
연산자 재정의(Operator Overloading) 개념
-
a + b 코드에서
-
a, b가 모두 primitive type(int, double등)일 경우 : 덧셈 수행
-
a, b중 하나라도 user defined type일 경우 : operator+() 함수를 찾게 됨
-
-
c1 + c2 코드를 컴파일러가 해석하는 방법
-
우선 c1.operator+(c2) 멤버 함수를 찾게 됨
-
없으면 operator+(c1, c2) 일반 함수를 찾게 됨
-
-
멤버 함수 구현
-
+는 이항 연산자 이지만 객체 자신이 있으므로 operator+() 함수의 인자는 1개
-
- 일반 함수 구현
- operator+()의 함수 인자는 2개
- 일반적으로 인자로 받은 객체 private 멤버 접근을 위해 friend 함수로 등록
class Complex
{
int re, im;
public:
Complex(int r = 0, int i = 0) : re(r), im(i) {}
void print() const
{
std::cout << re << ", " << im << std::endl;
}
// + 연산자 재정의
Complex operator+(const Complex& c)
{
Complex temp(re + c.re, im + c.im);
return temp;
}
friend Complex operator+(const Complex& c1, const Complex& c2); // friend 접근자 등록
};
Complex operator+(const Complex& c1, const Complex& c2)
{
// 일반함수에서 객체의 private 멤버에 접근이 필요하므로 friend 접근자 등록
Complex temp(c1.re + c2.re, c1.im + c2.im);
return temp;
}
int main()
{
int n = 3 + 4; // OK
Complex c1(1, 1);
Complex c2(2, 2);
Complex c3 = c1 + c2; // 1. c1.operator+(c2), 2. operator+(c1, c2)
c3.print();
}
연산자 재정의 정리
- 인자가 모두 primitive type인 경우는 재정의 불가
- 재정의 불가 연산자
- ".*", "::", "sizeof", "typeid", "static_cast", "dynamic_cast", "reinterpret_cast", "const_cast", "."
- 멤버 함수와 일반 함수로 2가지 모두 제공 가능
- 2가지 모두 제공시 멤버 함수 우선 호출
- 1번째 인자가 user defined type이 아닌 경우는 일반 함수로만 만들 수 있음(객체가 아니므로 멤버 함수 제공 불가)
- 멤버 함수로만 재정의 가능한 연산자
- "=", "()", "[]", "->"
- 새로운 연산자를 만들거나, 인자의 개수를 변경하거나, 연산자 우선순위를 변경 할 수 없음
- 기본 파라미터 사용 불가
중요 연산자들
-
<< : cout 의 원리
- ++ : STL 반복자를 만드는 원리, 구현 과정 중요
- -> : 스마트 포인터
- () : 함수 객체
- [] : 객체를 배열처럼
- = : 복사 생성자와 유사한 개념(Shallow copy / Deep copy)
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 함수 객체(Function Object) (0) | 2019.05.10 |
---|---|
C++ 연산자 재정의 - cout, endl 원리 (2) | 2019.05.08 |
C++ static, const, this (0) | 2019.05.07 |
C++ 복사 생성자 (0) | 2019.05.06 |
C++ 접근 지정자, 생성자, 소멸자 (0) | 2019.05.06 |