2010-10-21 16 views
8

ho visto la seguente implementazione dell'operatore * come segue:Perché tornare const razionale piuttosto che razionale

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); 
     }  
}; 

ho due domande qui:

  • Q1> il motivo per cui l'operatore * deve tornare const Rational piuttosto che semplicemente Rational
  • Q2> quando definiamo una funzione amico, dovremmo preoccuparci del modificatore di accesso?

risposta

12
  1. Così che non si può fare qualcosa di simile Rational a, b, c; (a * b) = c;.

  2. No.

+0

Ciao Oli, grazie mille – q0987

+2

Conciso, informativo, accurato. Buona risposta. –

10

noti che il ritorno const Rational anziché Rational impedisce non soltanto assegnazioni senza senso ma anche muovono semantica (perché Rational&& non si lega a const Rational) e quindi non è raccomandato più pratica in C++ 0x.

Scott Meyers ha scritto un note su questo argomento:

Dichiarare per valore valori di ritorno delle funzioni const sarà evitare che siano tenuti ad rvalue riferimenti in C++ 0x. Poiché i riferimenti di rvalue sono progettati per migliorare l'efficienza del codice C++, è importante considerare l'interazione dei valori di ritorno const e l'inizializzazione dei riferimenti rvalue quando specifica le firme di funzione.

+0

Per un esempio di semantica del movimento, si consideri 'a * b * c;' sovraccaricando 'operator *' con gli argomenti '&&', possiamo ottenere provini distruttibili per rubare risorse da, e quindi rimuovere allocazioni non necessarie da catene di operatori. –

+0

@Mat: Sebbene sia piuttosto improbabile che 'Rational' abbia risorse esterne, ma penso' stringa' o tipi simili e il mio argomento è valido :) – fredoverflow

+0

Sono d'accordo, in realtà stavo cercando di estendere la risposta con un esempio di quando spostare si applicherebbe la semantica :) –

Problemi correlati