Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO
✐ ✐ ✐ “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
- Page 345 and 346: ✐ ✐ ✐ “Volumen1” — 2012
- Page 347 and 348: ✐ ✐ ✐ “Volumen1” — 2012
- Page 349 and 350: ✐ ✐ ✐ “Volumen1” — 2012
- Page 351 and 352: ✐ ✐ ✐ “Volumen1” — 2012
- Page 353 and 354: ✐ ✐ ✐ “Volumen1” — 2012
- Page 355 and 356: ✐ ✐ ✐ “Volumen1” — 2012
- Page 357 and 358: ✐ ✐ ✐ “Volumen1” — 2012
- Page 359 and 360: ✐ ✐ ✐ “Volumen1” — 2012
- Page 361 and 362: ✐ ✐ ✐ “Volumen1” — 2012
- Page 363 and 364: ✐ ✐ ✐ “Volumen1” — 2012
- Page 365 and 366: ✐ ✐ ✐ “Volumen1” — 2012
- Page 367 and 368: ✐ ✐ ✐ “Volumen1” — 2012
- Page 369 and 370: ✐ ✐ ✐ “Volumen1” — 2012
- Page 371 and 372: ✐ ✐ ✐ “Volumen1” — 2012
- Page 373 and 374: ✐ ✐ ✐ “Volumen1” — 2012
- Page 375 and 376: ✐ ✐ ✐ “Volumen1” — 2012
- Page 377 and 378: ✐ ✐ ✐ “Volumen1” — 2012
- Page 379 and 380: ✐ ✐ ✐ “Volumen1” — 2012
- Page 381 and 382: ✐ ✐ ✐ “Volumen1” — 2012
- Page 383 and 384: ✐ ✐ ✐ “Volumen1” — 2012
- Page 385 and 386: ✐ ✐ ✐ “Volumen1” — 2012
- Page 387 and 388: ✐ ✐ ✐ “Volumen1” — 2012
- Page 389 and 390: ✐ ✐ ✐ “Volumen1” — 2012
- Page 391 and 392: ✐ ✐ ✐ “Volumen1” — 2012
- Page 393 and 394: ✐ ✐ ✐ “Volumen1” — 2012
- Page 395: ✐ ✐ ✐ “Volumen1” — 2012
- Page 399 and 400: ✐ ✐ ✐ “Volumen1” — 2012
- Page 401 and 402: ✐ ✐ ✐ “Volumen1” — 2012
- Page 403 and 404: ✐ ✐ ✐ “Volumen1” — 2012
- Page 405 and 406: ✐ ✐ ✐ “Volumen1” — 2012
- Page 407 and 408: ✐ ✐ ✐ “Volumen1” — 2012
- Page 409 and 410: ✐ ✐ ✐ “Volumen1” — 2012
- Page 411 and 412: ✐ ✐ ✐ “Volumen1” — 2012
- Page 413 and 414: ✐ ✐ ✐ “Volumen1” — 2012
- Page 415 and 416: ✐ ✐ ✐ “Volumen1” — 2012
- Page 417 and 418: ✐ ✐ ✐ “Volumen1” — 2012
- Page 419 and 420: ✐ ✐ ✐ “Volumen1” — 2012
- Page 421 and 422: ✐ ✐ ✐ “Volumen1” — 2012
- Page 423 and 424: ✐ ✐ ✐ “Volumen1” — 2012
- Page 425 and 426: ✐ ✐ ✐ “Volumen1” — 2012
- Page 427 and 428: ✐ ✐ ✐ “Volumen1” — 2012
- Page 429 and 430: ✐ ✐ ✐ “Volumen1” — 2012
- Page 431 and 432: ✐ ✐ ✐ “Volumen1” — 2012
- Page 433 and 434: ✐ ✐ ✐ “Volumen1” — 2012
- Page 435 and 436: ✐ ✐ ✐ “Volumen1” — 2012
- Page 437 and 438: ✐ ✐ ✐ “Volumen1” — 2012
- Page 439 and 440: ✐ ✐ ✐ “Volumen1” — 2012
- Page 441 and 442: ✐ ✐ ✐ “Volumen1” — 2012
- Page 443 and 444: ✐ ✐ ✐ “Volumen1” — 2012
- Page 445 and 446: ✐ ✐ ✐ “Volumen1” — 2012
✐<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