2010-10-21 6 views
8

, je vis la mise en œuvre suivante de l'opérateur * comme suit:Pourquoi revenir const rationnelle plutôt que rationnelle

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

J'ai deux questions ici:

  • Q1> pourquoi le * opérateur doit retourner const Rational plutôt que simplement Rational
  • Q2> lorsque nous définissons une fonction d'ami, devrions-nous nous préoccuper du modificateur d'accès?

Répondre

12
  1. Alors que vous ne pouvez pas faire quelque chose comme Rational a, b, c; (a * b) = c;.

  2. n °

+0

Bonjour Oli, merci beaucoup – q0987

+2

Concis, informatif, précis. Bonne réponse. –

10

Notez que le retour const Rational au lieu de Rational non seulement empêche, mais aussi se déplacer les affectations insensées sémantique (parce que Rational&& ne se lie pas à const Rational) et est donc pratique déconseillés plus en C++ 0x.

Scott Meyers a écrit un note à ce sujet:

Déclarant par valeur des valeurs de retour de la fonction CONST éviter qu'ils seront liés à rvalue références dans C++ 0x. Étant donné que les références rvalue sont conçues pour améliorer l'efficacité du code C++, il est important de prendre en compte l'interaction des valeurs de retour const et l'initialisation des références rvalue lorsque spécifiant des signatures de fonction.

+0

Pour un exemple de sémantique de mouvement, pensons 'a * b * c;' en surchargeant 'operator *' avec des arguments '&&', nous pouvons obtenir des temporaires destructibles pour voler des ressources, et ainsi supprimer des allocations inutiles des chaînes d'opérateurs. –

+0

@Mat: Bien qu'il soit plutôt improbable que 'Rational' ait des ressources externes, mais pense' string' ou des types similaires et mon argument est valide :) – fredoverflow

+0

Je suis d'accord, en fait j'essayais d'étendre ta réponse avec un exemple de quand bouger la sémantique s'appliquerait :) –

Questions connexes