Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 358 — #396 ✐ Capítulo 12. Sobrecarga de operadores Fee fum = fi; // Fee(Fi) } ///:~ Cuando se trata con el signo =, es importante mantener la diferencia en mente: Si el objeto no ha sido creado todavía, se requiere una inicialización; en otro caso se usa el operador de asignación =. Es incluso mejor evitar escribir código que usa = para la inicialización; en cambio, use siempre la manera del constructor explícito. Las dos construcciones con el signo igual se convierten en: Fee fee(1); Fee fum(fi); De esta manera, evitará confundir a sus lectores. 12.5.1. Comportamiento del operador = En Integer.h y en Byte.h vimos que el operador = sólo puede ser una función miembro. Está íntimamente ligado al objeto que hay en la parte izquierda del =. Si fuese posible definir operator= de forma global, entonces podría intentar redefinir el signo = del lenguaje: int operator=(int, MyType); // Global = !No permitido! El compilador evita esta situación obligandole a hacer un método operator=. Cuando cree un operator=, debe copiar toda la información necesaria desde el objeto de la parte derecha al objeto actual (es decir, el objeto para el que operator= está siendo llamado) para realizar lo que sea que considere «asignación» para su clase. Para objetos simples, esto es trivial: //: C12:SimpleAssignment.cpp // Simple operator=() #include using namespace std; class Value { int a, b; float c; public: Value(int aa = 0, int bb = 0, float cc = 0.0) : a(aa), b(bb), c(cc) {} Value& operator=(const Value& rv) { a = rv.a; b = rv.b; c = rv.c; return *this; } friend ostream& operator

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 359 — #397 ✐ 12.5. Sobrecargar la asignación }; int main() { Value a, b(1, 2, 3.3); cout

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 358 — #396<br />

✐<br />

Capítulo 12. Sobrecarga de operadores<br />

Fee fum = fi; // Fee(Fi)<br />

} ///:~<br />

Cuando se trata con el signo =, es importante mant<strong>en</strong>er la difer<strong>en</strong>cia <strong>en</strong> m<strong>en</strong>te:<br />

Si el objeto no ha sido creado todavía, se requiere una inicialización; <strong>en</strong> otro caso se<br />

usa el operador de asignación =.<br />

Es incluso mejor evitar escribir código que usa = para la inicialización; <strong>en</strong> cambio,<br />

use siempre la manera del constructor explícito. Las dos construcciones con el signo<br />

igual se conviert<strong>en</strong> <strong>en</strong>:<br />

Fee fee(1);<br />

Fee fum(fi);<br />

De esta manera, evitará confundir a sus lectores.<br />

12.5.1. Comportami<strong>en</strong>to del operador =<br />

En Integer.h y <strong>en</strong> Byte.h vimos que el operador = sólo puede ser una función<br />

miembro. Está íntimam<strong>en</strong>te ligado al objeto que hay <strong>en</strong> la parte izquierda del =. Si<br />

fuese posible definir operator= de forma global, <strong>en</strong>tonces podría int<strong>en</strong>tar redefinir<br />

el signo = del l<strong>en</strong>guaje:<br />

int operator=(int, MyType);<br />

// Global = !No permitido!<br />

El compilador evita esta situación obligandole a hacer un método operator=.<br />

Cuando cree un operator=, debe copiar toda la información necesaria desde el<br />

objeto de la parte derecha al objeto actual (es decir, el objeto para el que operator=<br />

está si<strong>en</strong>do llamado) para realizar lo que sea que considere «asignación» para su<br />

clase. Para objetos simples, esto es trivial:<br />

//: C12:SimpleAssignm<strong>en</strong>t.cpp<br />

// Simple operator=()<br />

#include <br />

using namespace std;<br />

class Value {<br />

int a, b;<br />

float c;<br />

public:<br />

Value(int aa = 0, int bb = 0, float cc = 0.0)<br />

: a(aa), b(bb), c(cc) {}<br />

Value& operator=(const Value& rv) {<br />

a = rv.a;<br />

b = rv.b;<br />

c = rv.c;<br />

return *this;<br />

}<br />

fri<strong>en</strong>d ostream&<br />

operator

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!