2010-10-21 11 views
8

widziałem następujące realizację operatora * następująco:Dlaczego powrócić const Rational zamiast Rational

class Rational { 
public: 
     Rational(int numerator=0, int denominator=1); 
     ... 
private: 
     int n, d; // numerator and denominator 
     friend const Rational operator*(const Rational& lhs, const Rational& rhs) 
     { 
      return Rational(lhs.n * rhs.n, lhs.d * rhs.d); 
     }  
}; 

Mam dwa pytania tutaj:

  • Q1> dlaczego operator * musi zwrócić const Rational zamiast po prostu Rational
  • Q2> kiedy zdefiniujemy funkcję przyjaciela, czy powinniśmy dbać o modyfikator dostępu?

Odpowiedz

12
  1. więc, że nie można zrobić coś takiego Rational a, b, c; (a * b) = c;.

  2. nr

+0

Witaj Oli, bardzo dziękuję – q0987

+2

Zwięzłe, informacyjne, dokładne. Dobra odpowiedź. –

10

Należy zauważyć, że powrót const Rational zamiast Rational zapobiega nie tylko zadania nonsensownych jednak również przenieść semantykę (ponieważ Rational&& nie wiąże się const Rational) i dlatego nie zaleca się już w praktyce C++ 0x.

Scott Meyers napisał note w tej sprawie:

Deklarowanie przez wartość wartości zwracanych funkcja const będzie uniemożliwić ich związany rvalue odniesienia w C++ 0x. Ponieważ referencje rvalue są zaprojektowane, aby pomóc poprawić Sprawność kodu C++, ważne jest, aby wziąć pod uwagę interakcji const zwracają wartości oraz inicjowanie referencji rvalue kiedy określające podpisów funkcyjnych.

+0

Dla przykładu semantyki ruchu, pomyśl 'a * b * c;' przez przeciążenie 'operator *' argumentami '&&', możemy uzyskać destruktywne tymczasowości, aby wykraść zasoby, a tym samym usunąć niepotrzebne alokacje z łańcuchów operatorów. –

+0

@Mat: Chociaż jest mało prawdopodobne, że 'Rational' ma jakieś zasoby zewnętrzne, ale myśli' string' lub podobne typy i mój argument jest ważny :) – fredoverflow

+0

Zgadzam się, właściwie próbowałem rozszerzyć twoją odpowiedź na przykład, kiedy semantyka miałaby zastosowanie :) –

Powiązane problemy