2014-10-05 5 views
-2

다음 함수를 빼기 함수 대신 부호 -을 포함하도록 변환하려고합니다. 그러나 그것은 기능이 실용적이지 않고 1 인자에 대한 lvalue를 기대한다고 말한다.C++에서 operator-() 오버로드 연산자

class fraction 
{ 
    long num; 
    long den; 
} 

나는 그 밖의 모든 것을 제외 시켰습니다.

inline fraction fraction::operator+(fraction &f) 
{ 
    fraction t; 
    t.num = num - f.num; 
    t.den = den - f.den; 
    return t; 
} 
inline const fraction sub(const fraction& f,const fraction& s) 
{ 
    return fraction (getNum(f)*getDen(s)-getDen(f)*getNum(s),getDen(f)*getDen(f)); 
} 
+1

'인라인 분수 :: operator + (const 분수 & f) const' –

+1

표현할 연산자는 무엇입니까? – juanchopanza

+0

아마도 연산자에'const'를 덧붙이기를 원할 것입니다. – Niall

답변

1

Herb Sutter's article 먼저 회원 빼기 - 할당 연산자를 구현 한 다음의 측면에서 비 멤버 빼기 연산자를 구현하기 위해 우리를 가르친다.

class fraction 
{ 
    long num; 
    long den; 

public: 
    fraction& operator-=(const fraction& rhs) 
    { 
     [[Underlying operations]] 
     return *this; 
    } 
}; 

inline fraction operator-(fraction lhs, const fraction& rhs) 
{ 
    lhs -= rhs; 
    return lhs; 
} 

멤버 빼기-할당 연산자는 객체 자체를 수정 한 다음의 규칙으로 참조 자체를 돌려 :

그래서,이 같은 일을 제안합니다.

비회원 빼기는 새 값을 만들어야하기 때문에 왼쪽에서 값을 취합니다. const 값은 우리가 방금 관찰 한 것처럼 좌변 치 참조에 의해 구합니다. 뺄셈은 실제로 뺄셈 할당 연산자에 의해 수행됩니다. 값으로 lhs를 반환합니다.

참조로 로컬 개체를 반환하지 마십시오. 그렇게하는 것은 정의되지 않은 동작입니다. 객체가 함수보다 오래있을 때만 참조로 반환합니다. 멤버 빼기 - 할당 연산자.

lvalue 관련 문제에 대해 언급 했으므로 const 왼쪽 값 참조 (const T&)는 lvalue와 rvalue를 모두 참조 할 수 있지만 lvalue가 아닌 왼쪽 참조 (T&)는 lvalue 만 참조 할 수 있습니다. 자세한 내용은 인터넷에서 "lvalue"및 "rvalue"및 "lvalue reference"및 "rvalue reference"를 조회하는 것이 좋으며 복잡 할 수 있습니다. 패스에 의해 값 반환 값 최적화 및 기타 문제에 관한 disfavouring 코멘트와


은 또한 const를 참조 좌를 복용 고려하고 로컬 복사본을 만들 수 있습니다.

inline fraction operator-(const fraction& lhs, const fraction& rhs) 
{ 
    fraction local_copy = lhs; 
    local_copy -= rhs; 
    return local_copy; 
} 
+0

값에 따라'lhs'를 취하는 것만 빼고는 좋은 조언이 될 것입니다. 반환 값 최적화를 금지하므로 실제로 필요한 것보다 더 많은 복사본을 만들 수 있습니다. 게다가 구현 세부 사항이 누설되어 연산자가 대칭이됩니다.이 특정 세부 사항은 나쁜 조언입니다. – juanchopanza

+0

이 모든 점을 자세히 설명해 주시겠습니까? –

+0

valid로 입력 매개 변수를 반환하면 RVO가 종료되므로 RVO가 적용될 경우 추가 사본 1 개가 생성됩니다 (두 개의 long을 포함하는 유형을 이동하면 복사하는 것보다 빠르기 때문에 전반적으로 효율성이 떨어집니다). 다른 두 점은 더 문체 적입니다 .Sutter의 게시물을 보면 몇 사람이 이에 대해 논평 한 것을 볼 수 있습니다. [블로그에서] (http://juanchopanzacpp.wordpress.com/2)에 대해 썼습니다. 014/05/11/want-speed-dont-always-pass-by-value /). – juanchopanza