2010-10-21 13 views
8

vi la siguiente implementación del operador * de la siguiente manera:¿Por qué volver const Racional que racional

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

Tengo dos preguntas aquí:

  • Q1> ¿Por qué el operador * tiene que volver const Rational en lugar de simplemente Rational
  • Q2> cuando definimos una función de amigo, ¿deberíamos preocuparnos por el modificador de acceso?

Respuesta

12
  1. Así que no se puede hacer algo como Rational a, b, c; (a * b) = c;.

+0

Hola Oli, muchas gracias – q0987

+2

concisa, informativa, precisa. Buena respuesta. –

10

Nota que la devolución de const Rational en lugar de Rational no sólo evita que las tareas sin sentido, pero también se mueven semántica (porque Rational&& no se une a const Rational) y por lo tanto no se recomienda la práctica más en C++ 0x.

Scott Meyers escribió un note sobre este asunto:

Declarar por valor valores de retorno función CONST impedir que sean obligados a RValue referencias en C++ 0x. Debido referencias rvalue están diseñados para ayudar a mejorar la eficiencia de código C++, es importante tomar en cuenta la interacción de retorno const valores y la inicialización de referencias rvalue cuando que especifican las firmas de función.

+0

Para un ejemplo de semántica de movimiento, piense 'a * b * c;' sobrecargando 'operator *' con argumentos '&&', podemos obtener temporarios destructibles para robar recursos, y así eliminar asignaciones innecesarias de cadenas de operadores. –

+0

@Mat: Aunque es bastante improbable que 'Rational' tenga recursos externos, pero piense' string' o tipos similares y mi argumento es válido :) – fredoverflow

+0

Estoy de acuerdo, en realidad estaba tratando de extender su respuesta con un ejemplo de cuando se mueve la semántica se aplicaría :) –

Cuestiones relacionadas