연산자 오버로딩이란?

C++에서 연산자가 하는 일을 함수로 개인의 필요에 맞게 구현한 것이다.

예를 들어, 클래스의 성격에 따라 필요한 연산 기능이 있다면 그에 맞게 동작하도록 기본 연산자의 기능을 재정의할 필요가 있다.

이것을 연산자 오버로딩이라 한다.

 

연산자 오버로드에 대한 일반 규칙

  • **과 같은 새로운 연자라를 정의할 수는 없다.
  • 기본 제공 데이터 형식에 적용할 때 연산자의 의미를 다시 정의 할 수 없다.
  • 오버로드 된 연산자는 비정적(non-static) 클래스 멤버 함수거나 전역 함수이어야 한다.
    (private 또는 protected 접근자의 전역 함수는 해당 클래스의 friend로 선언해야 한다.)
  • 단항 연산자 또는 이항 연산자(&, *, +, -)로 오버로드 가능하며 각 사용을 별도로 오버로드 할 수 있다.
  • 멤버 함수로 오버로드 된 연산자의 첫번째 파라미터는 항상 연산자가 호출되는 객체의 클래스 형식이다.
    (첫번째 파라미터에 대한 변환은 제공되지 않는다.)

오버로딩이 불가능한 연산자

연산자 이름
. 멤버선택
.* 멤버 포인터 선택
:: 범위
?: 조건
# 문자열 전처리기 변환
## 전처리기 연결

 

간단한 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
 
class Point {
private :
    int x, y;
 
public :
    Point(int x_, int y_) {
        x = x_;
        y = y_;
    }
 
    void print() {
        cout << "x : " << x << ", y : " << y << "\n";
    }
};
 
 
int main(void) {
    Point p1 = { 11 };
    Point p2(22);
    
    Point p3 = p1 + p2;  // 문제가 되는 라인
 
    p3.print();
 
    return 0;
}
cs

24 라인에서 사용한 Point 객체 p3에 p1과 p2를 더한값을 저장하려고 하는 문장을 실행하면 에러가 발생한다.
왜냐하면 + 연산자에 대해 Point 객체의 덧셈은 지원해주지 않기 때문이다.

 


이를 해결하기 위해 C++에서는 연산자 오버로딩을 제공한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
class Point {
private :
    int x, y;
 
public :
    Point(int x_, int y_) {
        x = x_;
        y = y_;
    }
 
    void print() {
        cout << "x : " << x << ", y : " << y << "\n";
    }
 
    //새로 생긴 함수
    Point operator + (Point& p) {
        x = x + p.x;
        y = y + p.y;
        return Point(x, y);
    }
};
 
 
int main(void) {
    Point p1 = { 11 };
    Point p2(22);
    
    Point p3 = p1 + p2;
 
    p3.print();
 
    return 0;
}
 
cs

새로운 함수로 operator +가 생성되었다.

+연산자에 대한 오버로딩 함수로, 반환형은 Point 객체이다.

함수명을 operator로 사용함으로써 컴파일러에게 연산자 오버로드 함수인 것을 명시한다.

 

이 함수는 31번째 라인에서 "Point p3 = p1 + p2;" 명령문으로 작동한다.

 

//출력결과

x : 3, y : 3

 

출처: https://yeolco.tistory.com/119

'C++' 카테고리의 다른 글

객체와 friend 함수  (0) 2019.11.27
생성자와 소멸자  (0) 2019.11.27
메모리 구조와 동적 메모리 할당  (0) 2019.11.27
C++이란?  (0) 2019.11.27

+ Recent posts