C ++의 두 매개 변수 모두에 대해 Const를 사용하여 연산자 우발
-
03-07-2019 - |
문제
두 개의 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 ;
}
일반적으로 친구를 선언해서는 안되기 때문에 비회원 기능을 선호해야합니다. 따라서 비회원이 아닌 친근한 기능을 사용하면 객체의 캡슐화가 향상됩니다.
면책 조항 : 다른 맛이 있지만 나는 산술 연산자와 같은 것을 제한하고 있습니다. +
, *
, /
, -
, "신뢰할 수있는"운영자 프로토 타입뿐만 아니라 여기.
운영자 사용을 분석하십시오
의 경우 +
:
- 각 피연산자는 일정해야합니다
a = b + c
변경해서는 안됩니다b
, 또는c
. - 당신은 축적 할 수 있습니다
+
,처럼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 ;
}
의 경우 +=
:
- 왼쪽 피연산자 A (a += b에서)가 수정된다는 것을 알고 있습니다.
- 당신은 왼쪽 피연산자 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
흥미롭고 잘못된 결과로 이어집니다.
^_^
마지막으로
오퍼레이터 과부하 프로토 타입 목록을 작성했습니다. 이 페이지. 이 페이지는 여전히 건설 중이지만 주된 용도 (복사/붙여 넣기 작업 프로토 타입)는 매우 유용 할 수 있습니다 ...