예제를 사용한 C++ 연산자 오버로딩
연산자 오버로딩이란 무엇입니까?
연산자 오버로딩 사용 C++에서는 하나의 범위에서 연산자에 대해 둘 이상의 의미를 지정할 수 있습니다. 연산자 오버로딩의 목적은 사용자 정의 데이터 유형에 대한 연산자의 특별한 의미를 제공하는 것입니다.
연산자 오버로딩의 도움으로 대부분의 C++ 연산자를 재정의할 수 있습니다. 연산자 오버로딩을 사용하여 하나의 연산자를 사용하여 다른 작업을 수행할 수도 있습니다.
이 C++ 자습서에서는 다음을 배우게 됩니다.
- 연산자 오버로딩이란 무엇입니까?
- 구문
- C++의 연산자 오버로딩에 대한 다양한 접근 방식
- 모든 C++ 연산자를 오버로드할 수 있습니까?
- 기억해야 할 사항:
- 연산자 오버로딩 규칙:
- 연산자 과부하 방법:
구문
C++ 연산자를 오버로드하려면 다음과 같이 클래스 내부에 특수 함수를 정의해야 합니다.
class class_name
{
... .. ...
public
return_type operator symbol (argument(s))
{
... .. ...
}
... .. ...
};
다음은 위의 구문에 대한 설명입니다.
- return_type은 함수의 반환 유형입니다.
- 다음으로 operator 키워드를 언급합니다.
- 기호는 오버로드될 연산자 기호를 나타냅니다. 예:+, -, <, ++.
- 인수는 함수와 같은 방식으로 연산자 함수에 전달할 수 있습니다.
예시 1:
#include <iostream>
using namespace std;
class TestClass {
private:
int count;
public:
TestClass() : count(5) {}
void operator --() {
count = count - 3;
}
void Display() {
cout << "Count: " << count; }
};
int main() {
TestClass tc;
--tc;
tc.Display();
return 0;
}
출력:
다음은 코드의 스크린샷입니다.
코드 설명:
- 해당 기능을 사용하기 위해 코드에 iostream 헤더 파일을 포함합니다.
- 호출 없이 클래스를 사용하려면 프로그램에 std 네임스페이스를 포함합니다.
- TestClass라는 클래스를 만듭니다.
- 클래스 구성원을 비공개로 액세스할 수 있는 것으로 표시하는 비공개 액세스 한정자를 사용합니다.
- 정수 변수 개수를 만듭니다. 이 변수는 비공개로 액세스할 수 있습니다.
- 클래스 구성원을 비공개로 액세스할 수 있는 것으로 표시하는 공개 액세스 한정자를 사용합니다.
- 클래스 생성자를 사용하여 변수 카운터를 5로 초기화합니다.
- - 연산자의 의미를 오버로드합니다.
- 연산자는 변수 x의 값을 1만큼 감소시킵니다.
- 연산자 오버로딩 섹션의 끝. 운영자에게 새 이름이 지정되었습니다.
- Display() 함수라는 이름의 함수 정의.
- Display() 함수가 호출될 때 콘솔의 다른 텍스트와 함께 변수 개수 값을 인쇄합니다. }는 Display() 함수 본문의 끝을 표시합니다.
- 클래스 본문 끝.
- main() 함수를 호출합니다. 이 함수 안에 프로그램 로직을 추가해야 합니다.
- TestClass 클래스의 인스턴스를 만들고 이름을 tc로 지정합니다.
- 이는 void 연산자 –() 함수를 호출합니다.
- TestClass 클래스의 자세를 사용하여 Display() 함수를 호출합니다.
- 함수는 성공적으로 완료되면 값을 반환해야 합니다.
- main() 함수 본문의 끝.
C++의 연산자 오버로딩에 대한 다양한 접근 방식
다음 유형의 함수를 구현하여 연산자 오버로딩을 수행할 수 있습니다.
- 회원 기능
- 비회원 기능
- 친구 기능
- 연산자 오버로딩 함수는 왼쪽 피연산자가 클래스의 개체일 때 멤버 함수일 수 있습니다.
- 왼쪽 피연산자가 다른 경우 연산자 오버로딩 함수는 비멤버 함수여야 합니다.
private 및 protected 클래스 멤버에 액세스해야 하는 경우 연산자 오버로딩 함수를 friend 함수로 만들 수 있습니다.
모든 C++ 연산자를 오버로드할 수 있습니까?
아니요. 오버로드할 수 없는 C++ 연산자가 있습니다.
여기에는 다음이 포함됩니다.
- ::-범위 확인 연산자
- ?:-삼항 연산자.
- . -멤버 선택자
- 크기 연산자
- * -멤버 포인터 선택기
기억해야 할 사항:
- 연산자 오버로딩을 사용하면 연산자가 사용자 정의 유형(객체, 구조)에 대해서만 작동하는 방식을 재정의할 수 있습니다. 내장형(float, char, int 등)에는 사용할 수 없습니다.
- =및 &C++ 연산자는 기본적으로 오버로드됩니다. 예를 들어 =연산자를 사용하여 동일한 클래스의 개체를 직접 복사할 수 있습니다.
- 연산자 우선 순위는 연산자의 우선 순위와 연관을 변경하지 않습니다. 그러나 괄호를 사용하여 평가 순서를 변경할 수 있습니다.
- C++에서 오버로드할 수 없는 네 가지 연산자가 있습니다. 여기에는 범위 확인 연산자(::), 멤버 선택 연산자(.), 함수 포인터를 통한 멤버 선택 연산자(.*), 삼항 연산자(?:)가 포함됩니다.
연산자 오버로딩 규칙:
연산자 오버로딩에 대한 규칙은 다음과 같습니다.
- 작동하려면 하나 이상의 피연산자가 사용자 정의 클래스 개체여야 합니다.
- 기존 연산자만 오버로드할 수 있습니다. 새 연산자를 오버로드할 수 없습니다.
- 일부 연산자는 friend 함수를 사용하여 오버로드할 수 없습니다. 그러나 이러한 연산자는 멤버 함수를 사용하여 오버로드될 수 있습니다.
연산자를 오버로드하는 방법:
예시 1:
#include <iostream>
using namespace std;
class OperatorOverload {
private:
int x;
public:
OperatorOverload() : x(10) {}
void operator ++() {
x = x + 2;
}
void Print() {
cout << "The Count is: " << x;
}
};
int main() {
OperatorOverload ov;
++ov;
ov.Print();
return 0;
}
출력:
다음은 코드의 스크린샷입니다.
코드 설명:
- 해당 기능을 사용하기 위해 코드에 iostream 헤더 파일을 포함합니다.
- 호출 없이 클래스를 사용하려면 프로그램에 std 네임스페이스를 포함합니다.
- OperatorOverload라는 클래스를 만듭니다.
- 클래스 구성원을 비공개로 액세스할 수 있는 것으로 표시하는 비공개 액세스 한정자를 사용합니다.
- 정수 변수 x를 만듭니다. 이 변수는 비공개로 액세스할 수 있습니다.
- 클래스 구성원을 비공개로 액세스할 수 있는 것으로 표시하는 공개 액세스 한정자를 사용합니다.
- 클래스 생성자를 사용하여 변수 x를 10으로 초기화합니다.
- ++ 연산자의 의미를 오버로드합니다.
- 연산자는 변수 x의 값을 2로 증가시킵니다.
- 연산자 오버로딩 섹션의 끝. 운영자에게 새 이름이 지정되었습니다.
- Print() 함수 호출.
- Print() 함수가 호출될 때 콘솔의 다른 텍스트와 함께 변수 x의 값을 인쇄합니다.
- Print() 함수 본문의 끝.
- 클래스 본문 끝.
- main() 함수를 호출합니다. 이 함수 안에 프로그램 로직을 추가해야 합니다.
- ov라는 OperatorOverload 클래스의 인스턴스를 만듭니다.
- 이는 void 연산자 ++() 함수를 호출합니다.
- OperatorOverload 클래스의 자세를 사용하여 Print() 함수를 호출합니다.
- 함수는 성공적으로 완료되면 값을 반환해야 합니다.
- main() 함수 본문의 끝.
예시 2:
#include<iostream>
using namespace std;
class TestClass {
private:
int real, over;
public:
TestClass(int rl = 0, int ov = 0) {
real = rl;
over = ov;
}
TestClass operator + (TestClass const &obj) {
TestClass result;
result.real = real + obj.real;
result.over = over + obj.over;
return result;
}
void print() {
cout << real << " + i" << over << endl;
}
};
int main()
{
TestClass c1(9, 5), c2(4, 3);
TestClass c3 = c1 + c2;
c3.print();
}
출력:
다음은 코드의 스크린샷입니다.
코드 설명:
- iostream 헤더 파일을 프로그램에 포함하여 기능을 사용합니다.
- 호출하지 않고 클래스를 사용하려면 std 네임스페이스를 프로그램에 포함합니다.
- TestClass라는 클래스를 만듭니다. {는 클래스 본문의 시작을 표시합니다.
- 비공개 액세스 수정자를 사용하여 변수를 비공개로 표시합니다. 즉, 클래스 내에서만 액세스할 수 있습니다.
- 실수와 그 이상의 정수 변수 2개를 정의합니다.
- 공개 액세스 한정자를 사용하여 생성자를 공개로 표시합니다. 즉, 클래스 외부에서도 액세스할 수 있습니다.
- 클래스 생성자 생성 및 변수 초기화.
- 변수 실수의 값을 초기화합니다.
- 변수의 값을 초기화합니다.
- 생성자 본문의 끝.
- + 연산자의 의미를 재정의합니다.
- TestClass 유형의 데이터 유형 결과를 생성합니다.
- 복소수에는 + 연산자를 사용합니다. 이 줄은 숫자의 실수 부분을 다른 숫자의 실수 부분에 더합니다.
- 복소수에는 + 연산자를 사용합니다. 이 줄은 숫자의 허수 부분을 다른 숫자의 허수 부분에 추가합니다.
- 프로그램은 성공적으로 실행되면 변수 결과 값을 반환합니다.
- + 연산자의 새로운 의미, 즉 오버로딩 정의 끝
- print() 메서드를 호출합니다.
- 콘솔에 추가 후 새로운 복소수를 인쇄합니다.
- print() 함수 본문의 끝.
- TestClass 클래스 본문 끝.
- main() 함수 호출.
- 추가할 실수 부분과 복소수 부분의 값을 모두 전달합니다. c1의 첫 번째 부분은 c2의 첫 번째 부분, 즉 9+4에 추가됩니다. c1의 두 번째 부분은 c의 두 번째 부분, 즉 5+3에 추가됩니다.
- 오버로드된 + 연산자를 사용하여 연산을 수행하고 결과를 변수 c3에 저장합니다.
- 콘솔에 변수 c3의 값을 출력합니다.
- main() 함수 본문의 끝.
요약:
- 한 범위에서 C++ 연산자에 대해 둘 이상의 의미를 지정할 수 있습니다.
- 이를 연산자 오버로딩이라고 합니다.
- 연산자 오버로딩은 사용자 정의 데이터 유형에 대한 연산자의 특별한 의미를 제공합니다.
- 연산자 오버로딩을 통해 대부분의 C++ 연산자를 재정의할 수 있습니다.
- 일부 C++ 연산자를 오버로드할 수 없습니다.
- 연산자가 오버로드되려면 피연산자 중 하나 이상이 사용자 정의 개체여야 합니다.
- 기존 연산자만 오버로드할 수 있습니다. 새 연산자를 오버로드할 수 없습니다.