operator 키워드는 이 클래스 인스턴스에 적용될 때의 operator-symbol 의미를 지정하는 함수를 선언합니다. 이 키워드는 연산자에게 둘 이상의 의미를 제공 즉, 오버로드합니다. 컴파일러는 피연산자의 형식을 검사하여 연산자의 여러 가지 의미 간을 구분합니다.
구문
형
operatoroperator-symbol(parameter-list)
설명
대부분의 기본 제공 연산자의 함수는 전역적으로 또는 클래스 단위로 다시 정의할 수 있습니다. 오버로드된 연산자는 함수로 구현됩니다.
오버로드된 연산자의 이름은 operatorx이며 여기서 x는 다음 테이블에 나와 있는 연산자입니다. 예를 들어 더하기 연산자를 오버로드하려면 operator+라는 함수를 정의합니다. 마찬가지로, 더하기/할당 연산자 +=를 오버로드하려면 operator+=라는 함수를 정의합니다.
다시 정의할 수 있는 연산자
| 연산자 | 속성 | Type |
|---|---|---|
| = | Comma | 이진 |
| = | 논리 NOT | 단항 |
| () | 같지 않음 | 이진 |
| % | 모듈러스 | 이진 |
| %= | 모듈러스 대입 | 이진 |
| = | 비트 AND | 이진 |
| = | Address-of | 단항 |
| () | 논리적 AND | 이진 |
| () | 비트 AND 대입 | 이진 |
| , , | 함수 호출 | = |
| , , | 캐스트 연산자 | 단항 |
* |
곱하기 | 이진 |
* |
포인터 역참조 | 단항 |
*= |
곱하기 할당 | 이진 |
| + | 더하기 | 이진 |
| + | 단항 더하기 | 단항 |
| ++ | 증가 1 | 단항 |
| += | 더하기 할당 | 이진 |
| - | 빼기 | 이진 |
| - | 단항 부정 연산자 | 단항 |
| -- | 감소 1 | 단항 |
| -= | 빼기 할당 | 이진 |
| => | 멤버 선택 | 이진 |
->* |
멤버 포인터 선택 | 이진 |
| / | 나누기 | 이진 |
| /= | 나누기 할당 | 이진 |
| < | 보다 작음 | 이진 |
| << | 왼쪽 시프트 | 이진 |
| <<= | 왼쪽 시프트 할당 | 이진 |
| <= | 보다 작거나 같음 | 이진 |
| = | 양도 | 이진 |
| == | Equality | 이진 |
| > | 보다 큼 | 이진 |
| >= | 크거나 같음 | 이진 |
| >> | 오른쪽 시프트 | 이진 |
| >>= | 오른쪽 시프트 할당 | 이진 |
| , , | 배열 첨자 | = |
| ^ | 배타적 OR | 이진 |
| ^= | 배타적 OR 할당 | 이진 |
| | | 포괄적 비트 OR | 이진 |
| |= | 포괄적 비트 OR 대입 | 이진 |
| || | 논리적 OR | 이진 |
| ~ | 1의 보수 | 단항 |
delete |
삭제 | = |
new |
새로 만들기 | = |
| 변환 연산자 | 변환 연산자 | 단항 |
1 단항 증가 및 감소 연산자에는 두 가지 버전 즉, 사전 증가 및 사후 증가가 있습니다.
자세한 내용은 연산자 오버로드에 대한 일반 규칙을 참조하세요. 다양한 범주의 오버로드된 연산자에 대한 제약 조건이 다음 항목에 설명되어 있습니다.
다음 테이블의 연산자는 오버로드할 수 없습니다. 이 테이블에는 전처리기 기호인 # 및 ## 기호가 포함됩니다.
다시 정의할 수 없는 연산자
| 연산자 | 속성 |
|---|---|
| . | 멤버 선택 |
.* |
멤버 포인터 선택 |
| :\ | 범위 확인 |
| = : | 조건부 |
| # | 문자열로 전처리기 변환 |
| ## | 전처리기 연결 |
오버로드된 연산자는 코드에서 발견되었을 때 일반적으로 컴파일러에 의해 암시적으로 호출되지만 다음과 같이 멤버 또는 비멤버 함수가 호출될 때처럼 명시적으로 호출할 수 있습니다.
Point pt;
pt.operator+( 3 ); // Call addition operator to add 3 to pt.
예시
다음 예제에서는 + 연산자를 오버로드하여 두 개의 복소수를 추가하고 그 결과를 반환합니다.
// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct Complex {
Complex( double r, double i ) : re(r), im(i) {}
Complex operator+( Complex &other );
void Display( ) { cout << re << ", " << im << endl; }
private:
double re, im;
};
// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
return Complex( re + other.re, im + other.im );
}
int main() {
Complex a = Complex( 1.2, 3.4 );
Complex b = Complex( 5.6, 7.8 );
Complex c = Complex( 0.0, 0.0 );
c = a + b;
c.Display();
}
6.8, 11.2