Jacob tiene razón ... una función declarada dentro de una clase tiene acceso a esa clase, pero no está dentro de la clase, y todos los demás tienen acceso a ella.
Para una sobrecarga de operador que no es un miembro de la clase (también llamada función libre, puede ser un amigo, o tal vez no), los argumentos son los mismos que los operandos. Para uno que es miembro de una clase, el primer operando es el "argumento implícito" que se convierte en this
.
El argumento implícito es diferente del primer argumento a una función gratuita de varias maneras:
- Su tipo es la referencia a la clase, mientras que la función libre puede declarar cualquier tipo para su primer argumento.
- No participa en la conversión de tipo implícita. (No será una inicialización temporal de un constructor de conversión.)
- Participa en la resolución de anulación virtual. (A sobrecarga
virtual
será elegido por el tipo dinámico del primer operando, que no es posible con funciones libres sin código extra.)
La situación es la misma para unario, binario, o n-ary (en el caso de operator()
).
miembros privilegio de mutación: operadores que cambian el primer operando (por ejemplo +=
, =
, prefijo ++
) debe ser implementado como funciones miembro, y debe aplicar exclusivamente las tripas de todos sobrecargas. Postfix ++
es un ciudadano de segunda clase; está implementado como Obj ret = *this; ++ this; return ret;
. Tenga en cuenta que esto a veces se extiende a copy-constructors, que puede contener *this = initializer
.
Regla de libertad para viajeros: Solo los operadores conmutativos (p. Ej. /
) deben ser funciones gratuitas; todos los demás operadores (por ejemplo, algo unario) deberían ser miembros. Los operadores conmutativos hacen inherentemente una copia del objeto; se implementan como Obj ret = lhs; ret @= rhs; return ret;
donde @
es el operador conmutativo y lhs
y rhs
son argumentos del lado izquierdo y del lado derecho, respectivamente.
Golden rule of C++ friendship: Evita la amistad. friend
contamina la semántica de un diseño. Corolario de sobrecarga: La sobrecarga es simple si sigue las reglas anteriores, entonces friend
es inofensivo. friend
ing. Las definiciones de sobrecarga de las calcomanías les permiten ubicarse dentro de las llaves class {
.
Tenga en cuenta que algunos operadores no pueden ser funciones gratuitas: =
, ->
, []
y ()
, debido a que la norma dice específicamente por lo que en la sección 13.5. Creo que eso es todo ... Pensé que unario &
y *
también, pero aparentemente estaba equivocado. Ellos deberían siempre estar sobrecargados como miembros, sin embargo, ¡y solo después de una cuidadosa reflexión!
¿por qué los operadores unarios no pueden ser amigos? – Vijay
Porque no es necesario que lo sean. Los operadores amigos pueden permitirle poner un tipo de clase a la derecha de un operador binario. Como los operadores unarios no tienen el lado derecho, no los necesitas para que sean amigos. – Stewart
@cpp: Lo siento, recordé mal el estándar. No importa. – Potatoswatter