2011-05-20 10 views
5

En primer lugar, ¿por qué volver const? decir que tengo¿Por qué alguna vez una función devuelve un const, o const referencia

friend const MyVec operator-(const MyVec& left, const MyVec& right) 

por lo regresa const me hace no puedo hacer:

mva - mvb = mvc; 

En segundo lugar, ¿por qué volver referencia constante? si hay:

friend const MyVec& operator++(MyVec& v) 

con const no puedo: (++mva) = mvc

si es

MyVec& operator++(MyVec& v)

puedo: // ++(++mva) con incremento de dos veces.

estoy Entendiendo ¿verdad?

Respuesta

7

No hay ninguna buena razón para devolver un objeto const. Sin embargo, hay muchas buenas razones para devolver punteros o referencias a objetos const.

El programa puede tener un objeto que es muy costoso de copiar, por lo que devuelve una referencia. Sin embargo, el objeto no se debe cambiar a través de esa referencia. Por ejemplo, podría ser parte de una estructura de datos clasificada y, si se modificaran sus valores, ya no se ordenaría correctamente. Entonces la const evita que se modifique accidentalmente.

Las funciones del operador aritmético no deben devolver objetos const, debido exactamente a los problemas en su pregunta.

La desreferenciación de un iterador debe devolver una referencia constante. Eso es si está operando en una colección de objetos const o posiblemente en una colección const. Esta es la razón por funciones de clase a veces tienen dos copias de una función con la segunda copia utilizando una constante en la función en sí, así:

T& operator[](size_t index); 
const T& operator[](size_t index) const; 

La primera función se utiliza en objetos no const y la segunda función sería ser utilizado para objetos const.

+0

"a veces el operador ++ usado en un iterador debe devolver una referencia constante" No. No debería. Porque todos esperan que la expresión '++ (++ obj)' sea válida. La forma más útil de definir el operador de prefijo ++ es 'T & T :: operator ++() {...}' y no hay una buena razón para definirlo de otra manera. ¿Puede ser que hayas escrito mal algo? ¿Tal vez quieres decir 'operador []' como en tu ejemplo? –

+0

"No hay una buena razón para devolver un objeto const" Sí, ver el artículo 21 efectivo de C++.Para evitar construcciones como (a * b) = c – rve

+0

"Las funciones del operador aritmético no deben devolver objetos const": Suponiendo que se refiere a - y + etc. Sí deberían: ver Effective C++ y http://www.cs.caltech.edu /courses/cs11/material/cpp/donnie/cpp-ops.html – rve

3

Sí, su comprensión es correcta. Para evitar asignaciones accidentales, se puede devolver un objeto por const o const reference.

Con operator -, devuelve un objeto por valor. Para evitar que se edite accidentalmente, uno puede devolver el valor const, porque de todos modos el objeto será principalmente temporal.

Para operator ++, convencionalmente devuelve referencia, pero para evitar situaciones como (++ x) = y; puede devolverlo por const de referencia.

+1

La devolución de un valor de const hace que la semántica de movimiento automático sea imposible al compilar con un compilador de C++ 11; en realidad es solo un terrible consejo. – ildjarn

+2

@ildjarn, puede ser. Pero no estaba aconsejando :). Es la respuesta a lo que él preguntó. Cualquiera de los que preguntan no está usando C++ 11 o está consciente de esas implicaciones. – iammilind

+1

Oh, no quise dar a entender que estabas aconsejando devolver los valores 'const'; Solo quise decir que es un mal consejo en general en el advenimiento de C++ 11. : -] – ildjarn

Cuestiones relacionadas