문제

두 개의 const 매개 변수를 사용하여 재정의 연산자 함수를 만들려고하지만 어떻게 해야하는지 알 수 없습니다. 간단한 예는 다음과 같습니다.

class Number
{
    Number()
    {
        value = 1;
    };

    inline Number operator + (const Number& n)
    {
        Number result;

        result.value = value + n.value;
        return result;
    }

    int value;
}

내가 여기서하려고하는 것은 두 가지 논증을 Const 인 추가 함수로 전달하고 수업에서 아무것도 변경하지 않고 결과를 반환하는 것입니다.

const Number a = Number();
const Number b = Number();
Number c = a + b;

이것이 가능하고 어떻게해야합니까?

감사,

도움이 되었습니까?

해결책

inline 클래스 선언에서 이해되므로 지정할 필요가 없습니다.

대부분의 관용적으로, 당신은 만들 것입니다 operator+ 다음과 같이 클래스 정의 밖에서 선언 된 비회원 함수는 다음과 같습니다.

Number operator+( const Number& left, const Number& right );

당신은 그것을 만들어야 할 수도 있습니다 friend 액세스가 필요한 경우 수업의 Number내부.

멤버 기능으로 사용해야하는 경우 기능 자체를 const로 만들어야합니다.

Number operator+( const Number& n ) const
{ // ...

같은 수업을 위해 Number, operator+ 일반적으로 측면에서 구현됩니다 operator+= 일반적으로 모든 일반 연산자가 예상대로 작동하기를 원하며 operator+= 일반적으로 구현하기가 더 쉽습니다 operator+ 별도로 구현하는 것보다 효율성을 잃지 않는 경향이 있습니다.

수업 내에서 :

Number& operator+=( const Number& n );

수업 밖에서 :

Number operator+( const Number& left, const Number& right )
{
    return Number( left ) += right;
}

또는:

Number operator+( Number left, const Number& right )
{
    return left += right;
}

다른 팁

class Number
{
    Number()
    {
        value = 1;
    };

    inline Number operator + (const Number& n) const
    {
        Number result;

        result = value + n.value;
        return result;
    }

    int value;
}

어때요 :

inline Number operator + (const Number& n) const

이전 답변이 충분하다고 생각하지만 일부 설명이 필요하다고 생각합니다.

연산자는 두 가지 맛으로 (보통)옵니다

첫 번째는 비회원 함수이며, 두 번째는 매개 변수가 작업의 "오른쪽 피연산자"이고 일반적으로 현재 수정 된 객체를 반환하는 멤버 함수입니다.

예를 들어, 연산자가 있다고 상상해보십시오 § 수업을 위해 T. 그것은 a로 작성 될 수 있습니다 비회원 기능:

T operator § (const T & lhs, const T & rhs)
{
   T result ;
   // do the lhs § rhs operation, and puts the result into "result"
   return result ;
}

또는 a 회원 기능:

T & T::operator § (const T & rhs)
{
   // do the "this § rhs" operation, and puts the result into "this"
   return *this ;
}

또는 심지어 (매우 비정상적으로) 다른 것입니다 회원 기능:

T T::operator § (const T & rhs) const
{
   T result ;
   // do the "this § rhs" operation, and puts the result into "result"
   return result ;
}

일반적으로 친구를 선언해서는 안되기 때문에 비회원 기능을 선호해야합니다. 따라서 비회원이 아닌 친근한 기능을 사용하면 객체의 캡슐화가 향상됩니다.

면책 조항 : 다른 맛이 있지만 나는 산술 연산자와 같은 것을 제한하고 있습니다. +, *, /, -, "신뢰할 수있는"운영자 프로토 타입뿐만 아니라 여기.

운영자 사용을 분석하십시오

의 경우 +:

  1. 각 피연산자는 일정해야합니다 a = b + c 변경해서는 안됩니다 b, 또는 c.
  2. 당신은 축적 할 수 있습니다 +,처럼 a = b + c + d + e, 따라서 임시는 존재해야합니다.
T operator § (const T & lhs, const T & rhs)
{
   T result ;
   // do the lhs § rhs operation, and puts the result into "result"
   return result ;
}

의 경우 +=:

  1. 왼쪽 피연산자 A (a += b에서)가 수정된다는 것을 알고 있습니다.
  2. 당신은 왼쪽 피연산자 A (a += b에서)가 고유 한 결과라는 것을 알고 있습니다.

그래서 당신은 다음을 사용해야합니다.

T & T::operator += (const T & rhs)
{
   // do the "this § rhs" operation, and puts the result into "this"
   return *this ;
}

항상 그렇듯이 조기 최적화는 모든 악의 근원입니다.

나는 이런 종류의 코드를 생산 코드에서 보았으므로 하다 일어나다:

T & operator + (const T & lhs, const T & rhs)
{
   static T result ; // result is STATIC !!!!
   // do the lhs + rhs operation, and puts the result into "result"
   return result ;
}

저자는 하나의 임시를 경제하기를 희망했다. 이런 종류의 코드로 글을 쓰고 있습니다 a = b + c + d 흥미롭고 잘못된 결과로 이어집니다.

^_^

마지막으로

오퍼레이터 과부하 프로토 타입 목록을 작성했습니다. 이 페이지. 이 페이지는 여전히 건설 중이지만 주된 용도 (복사/붙여 넣기 작업 프로토 타입)는 매우 유용 할 수 있습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top