연산자 오버로드
operator
키워드(keyword) 클래스 인스턴스에 적용할 때 연산자 기호의 의미를 지정하는 함수를 선언합니다. 이 키워드는 연산자에게 둘 이상의 의미를 제공 즉, 오버로드합니다. 컴파일러는 피연산자의 형식을 검사하여 연산자의 여러 가지 의미 간을 구분합니다.
구문
type
operator
operator-symbol(parameter-list)
설명
대부분의 기본 제공 연산자의 함수는 전역적으로 또는 클래스 단위로 다시 정의할 수 있습니다. 오버로드된 연산자는 함수로 구현됩니다.
오버로드된 연산자의 이름은 x입니다operator
. 여기서 x는 다음 표에 표시된 연산자입니다. 예를 들어 더하기 연산자를 오버로드하려면 operator+라는 함수를 정의합니다. 마찬가지로 더하기/대입 연산+=자를 오버로드하려면 operator+=라는 함수를 정의합니다.
다시 정의할 수 있는 연산자
연산자 | 이름 | Type |
---|---|---|
, | Comma | 이진 |
! | 논리 NOT | 단항 |
!= | 같지 않음 | 이진 |
% | 모듈러스 | 이진 |
%= | 모듈러스 대입 | 이진 |
& | 비트 AND | 이진 |
& | Address-of | 단항 |
&& | 논리적 AND | 이진 |
&= | 비트 AND 대입 | 이진 |
( ) | 함수 호출 | — |
( ) | 캐스트 연산자 | 단항 |
* |
곱하기 | 이진 |
* |
포인터 역참조 | 단항 |
*= |
곱하기 할당 | 이진 |
+ | 더하기 | 이진 |
+ | 단항 더하기 | 단항 |
++ | 증 분 1 | 단항 |
+= | 더하기 할당 | 이진 |
- | 빼기 | 이진 |
- | 단항 부정 연산자 | 단항 |
-- | 감소 1 | 단항 |
-= | 빼기 할당 | 이진 |
-> | 멤버 선택 | 이진 |
->* |
멤버 포인터 선택 | 이진 |
/ | 나누기 | 이진 |
/= | 나누기 할당 | 이진 |
< | 보다 작음 | 이진 |
<< | 왼쪽 시프트 | 이진 |
<<= | 왼쪽 시프트 할당 | 이진 |
<= | 보다 작거나 같음 | 이진 |
= | 양도 | 이진 |
== | Equality | 이진 |
> | 보다 큼 | 이진 |
>= | 크거나 같음 | 이진 |
>> | 오른쪽 시프트 | 이진 |
>>= | 오른쪽 시프트 할당 | 이진 |
[ ] | 배열 첨자 | — |
^ | 배타적 OR | 이진 |
^= | 배타적 OR 할당 | 이진 |
| | 포괄적 비트 OR | 이진 |
|= | 포괄적 비트 OR 대입 | 이진 |
|| | 논리적 OR | 이진 |
~ | 1의 보수 | 단항 |
delete |
삭제 | — |
new |
새로 만들기 | — |
conversion operators | conversion operators | 단항 |
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
이 섹션의 내용
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기