> 백엔드 개발 > C++ > C에서 사전 및 사후 증분 모두에 대해 증분 연산자( )를 오버로드하는 방법은 무엇입니까?

C에서 사전 및 사후 증분 모두에 대해 증분 연산자( )를 오버로드하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-02 22:38:03
원래의
485명이 탐색했습니다.

 How to Overload the Increment Operator (  ) for Both Pre and Post-Increment in C  ?

사전 및 사후 증분에 대한 오버로딩: 모호성 해결

C에서 연산자를 오버로드하여 내장 연산자의 기능을 확장할 수 있습니다. 사용자 정의 유형. 일반적인 사용 사례 중 하나는 사전 및 사후 증분 작업 모두에 대해 증분 연산자( )를 오버로드하는 것입니다. 그러나 모호성 문제 없이 이를 달성하는 것은 어려운 일입니다.

초기 접근 방식: 동일한 반환 유형

제공된 코드 조각에서 초기 시도는 연산자에 사전 및 사후 증가 모두에 대해 동일한 반환 유형(int)입니다. 그러나 이 접근 방식은 다음과 같은 이유로 실패합니다.

  • 반환 유형에 따른 함수 오버로딩:
    C에서는 반환 유형에만 기반한 함수 오버로딩을 허용하지 않습니다. 다양한 인수 유형으로 오버로드를 구별할 수 있지만, 서로 다른 반환 유형만으로는 충분하지 않습니다.
  • 오버로드 해결의 모호성:
    SampleObject를 호출할 때 컴파일러는 어떤 오버로드를 수행할지 결정할 수 없습니다. 둘 다 동일한 유형을 반환하므로 사용하세요. 이 모호성은 컴파일 시간 오류를 발생시킵니다.

해결책: 더미 인수로 오버로딩

이 모호성을 해결하기 위해 연산자의 후위 버전은 다음으로 오버로드됩니다. 더미 int 매개변수. 이 수정은 두 가지 목표를 달성합니다.

  • Postfix 오버로드 구별:
    더미 매개 변수는 접두사 오버로드와 구별되는 postfix 오버로드에 대한 고유한 서명을 제공합니다.
  • 증분 논리 보존:
    접두사 오버로드는 변경되지 않고 그대로 유지되어 현재 인스턴스를 증가시키고 이에 대한 참조를 반환합니다. 접미사 오버로드는 현재 인스턴스의 임시 복사본을 생성하고 이를 증가시킨 후 증가 전의 값을 반환합니다.

코드 예:

<code class="cpp">#include <iostream>

class CSample {
 public:
  int m_iValue;     // just to directly fetch inside main()
  CSample() : m_iValue(0) {}
  CSample(int val) : m_iValue(val) {}

  // Overloading ++ for Pre-Increment
  CSample& operator++() {
    ++m_iValue;
    return *this;
  }

  // Overloading ++ for Post-Increment
  CSample operator++(int) {
    CSample tmp(*this);
    operator++(); // prefix-increment this instance
    return tmp;   // return value before increment
  }
};

int main() {
  CSample obj1(5);
  std::cout << obj1.m_iValue << std::endl; // Output: 5

  // Pre-Increment
  ++obj1;
  std::cout << obj1.m_iValue << std::endl; // Output: 6

  // Post-Increment
  CSample obj2 = obj1++;
  std::cout << obj2.m_iValue << std::endl; // Output: 6
  std::cout << obj1.m_iValue << std::endl; // Output: 7

  return 0;
}</code>
로그인 후 복사

후위 버전에 대한 더미 인수로 연산자를 오버로드함으로써 모호성을 효과적으로 해결하고 C의 사용자 정의 유형에 대한 사전 및 사후 증분 동작을 모두 활성화합니다.

위 내용은 C에서 사전 및 사후 증분 모두에 대해 증분 연산자( )를 오버로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿