ApéndiceBDe C a C++Que tengas este libro entre tus manos, significa que tienes unos <strong>con</strong>ocimientosmínimamente razonables <strong>de</strong> programación. Probablemente estarás familiarizado<strong>con</strong> el lenguaje C. En el presente capítulo voy a tratar <strong>de</strong> hacer una introduccióna la programación orientada a objetos en C++. Evi<strong>de</strong>ntemente, para hacer unabuena introducción necesitaríamos todo un libro. En la bibliografía hay algunosmuy buenos que te servirán para profundizar. El objetivo, pues, <strong>de</strong> este apéndice esacercar la POO en C++ a los programadores <strong>con</strong> <strong>con</strong>ocimientos previos <strong>de</strong> C. Noscentraremos en los aspectos más relevantes y, <strong>de</strong>sgraciadamente, por la extensiónlimitada <strong>de</strong> la presente obra, <strong>de</strong>jaremos <strong>de</strong> lado las características más complejas omenos útiles <strong>de</strong> este lenguaje. Ni que <strong>de</strong>cir tiene que si ya eres un experto en C++,pue<strong>de</strong> prescindir alegremente este apéndice.Pue<strong>de</strong> que en estos momentos te estés preguntando si es realmente necesario utilizarC++ y si C no es suficiente. Rotundamente sí. Pue<strong>de</strong>s acometer el <strong>de</strong>sarrollo <strong>de</strong> juegosrazonablemente complejos en C, sin embargo, la POO nos aporta ciertamente una serie<strong>de</strong> ventajas que hemos <strong>de</strong> tener muy en cuenta a la hora <strong>de</strong> sentarnos a programar,como:• Una mayor abstracción <strong>de</strong> datos.• Más facilidad para la reutilización <strong>de</strong> código.• Mantenimiento y extensión <strong>de</strong> las aplicaciones más fácil.• Mayor potencia (herencia y polimorfismo).• Mo<strong>de</strong>lado <strong>de</strong> problemas reales <strong>de</strong> forma más directa.Quizás todo esto te suene un poco ajeno a la forma a la que estás acostumbrado aprogramar, e incluso pue<strong>de</strong> que ni te suenen algunos <strong>de</strong> estos <strong>con</strong>ceptos, pero al finalizar elcapítulo, <strong>de</strong>berán serte familiares.Todo esto suena bien, pero ¿qué es un objeto? Trataré, sin entrar en <strong>de</strong>masiadosformalismos, explicarlo <strong>de</strong> la forma más intuitiva posible. Si te pido que pienses en un objeto,seguramente pensarás en un lápiz, una mesa, unas gafas <strong>de</strong> sol, un coche o cualquier otracosa que caiga <strong>de</strong>ntro <strong>de</strong> tu radio <strong>de</strong> visión. Esta es la i<strong>de</strong>a intuitiva <strong>de</strong> objeto. Algo físico ymaterial. En POO, el <strong>con</strong>cepto <strong>de</strong> objeto no es muy diferente. Una <strong>de</strong> las diferencias básicasevi<strong>de</strong>ntes es que un objeto en C++ pue<strong>de</strong> hacer referencia a algo abstracto.Como en el ejemplo <strong>de</strong>l coche, un objeto pue<strong>de</strong> estar compuesto por otra clase <strong>de</strong> objetos,como ruedas, carrocería, etc... Este <strong>con</strong>cepto <strong>de</strong> clase <strong>de</strong> objeto es importante. Un objetosiempre pertenece a una clase <strong>de</strong> objetos. Por ejemplo, todas las ruedas, <strong>con</strong> in<strong>de</strong>pen<strong>de</strong>ncia<strong>de</strong> su tamaño, pertenecen a la clase “rueda”. Hay muchos objetos rueda diferente quepertenecen a la clase rueda. Cada una <strong>de</strong> estas ruedas diferentes se llaman instancias <strong>de</strong> laclase “rueda”. Tenemos, pues, instancias <strong>de</strong> la clase rueda que son ruedas <strong>de</strong> camión, ruedas<strong>de</strong> coches o ruedas <strong>de</strong> moto.143
Volvamos al ejemplo <strong>de</strong>l coche. Vamos a <strong>de</strong>finir otra clase <strong>de</strong> objeto, la clase “Coche”. Laclase coche <strong>de</strong>fine a “algo” que está compuesto por objetos (instancias) <strong>de</strong> la clase rueda, laclase carrocería, la clase volante, etc... Ahora vamos a crear un objeto <strong>de</strong> la clase coche, alque llamaremos coche_rojo. En este caso hemos instanciado un objeto <strong>de</strong> la clase coche yhemos <strong>de</strong>finido uno <strong>de</strong> sus atributos, el color, al que hemos dado el valor <strong>de</strong> rojo. Vemos puesque un objeto pue<strong>de</strong> poseer atributos. Sobre el objeto coche po<strong>de</strong>mos <strong>de</strong>finir tambiénacciones u operaciones posibles. Por ejemplo, el objeto coche, entre otras cosas, pue<strong>de</strong>realizar las operaciones <strong>de</strong> acelerar, frenar, girar a la izquierda, etc... Estas operaciones quepue<strong>de</strong>n ser ejecutadas sobre un objeto se llaman métodos <strong>de</strong>l objeto.Po<strong>de</strong>mos hacer ya una primera <strong>de</strong>finición <strong>de</strong> lo que es un objeto. Es la instancia <strong>de</strong> unaclase <strong>de</strong> objeto <strong>con</strong>creta, que está compuesta por atributos y métodos. Esta <strong>de</strong>finición nosmuestra ya una <strong>de</strong> las tres principales características que <strong>de</strong>finen a la POO. Me refiero alEncapsulamiento, que no es, ni más ni menos, que la capacidad que tiene un objeto <strong>de</strong><strong>con</strong>tener datos (atributos) y código (métodos).Clases y objetosVeamos en la práctica como se <strong>de</strong>clara una clase y se instancia un objeto en C++.Podríamos afirmar que, en C++, una clase es algo muy similar a una estructura <strong>de</strong> C en la quea<strong>de</strong>más <strong>de</strong> almacenar datos, po<strong>de</strong>mos añadir las funciones (métodos) que harán uso <strong>de</strong>estos datos. Siguiendo <strong>con</strong> el ejemplo anterior, vamos a <strong>de</strong>clarar la clase “coche”.// Declaración <strong>de</strong> la clase cocheclass Coche {// Atributos <strong>de</strong> la clase cocheint velocidad;// Métodos <strong>de</strong> la clase cochevoid acelerar(int velocidad);void frenar();};En este ejemplo hemos <strong>de</strong>clarado la clase coche. Lo primero que pue<strong>de</strong> chocar alprogramador <strong>de</strong> C es la forma <strong>de</strong> incluir comentarios en el código. C++ permite seguir usandocomentarios al estilo <strong>de</strong> C, pero también aña<strong>de</strong> una nueva forma <strong>de</strong> hacerlo mediante las dosbarras //. C++ interpreta que lo que sigue a las dos barras y hasta el final <strong>de</strong> la línea es uncomentario.La <strong>de</strong>claración <strong>de</strong> la clase coche muestra claramente dos partes diferenciadas. Por unlado, tenemos la <strong>de</strong>claración <strong>de</strong> los atributos <strong>de</strong> la clase (también llamados datos miembro <strong>de</strong>la clase), que en este caso <strong>de</strong>scribe la velocidad <strong>de</strong>l coche. Po<strong>de</strong>mos <strong>de</strong>cir que las variablesmiembro <strong>de</strong> una clase <strong>de</strong>finen el estado <strong>de</strong>l objeto (en este caso el estado <strong>de</strong>l coche estáformado exclusivamente por su velocidad). Ni que <strong>de</strong>cir tiene que esto es un ejemplo muysimplificado y que una clase que tratara <strong>de</strong> <strong>de</strong>scribir el comportamiento <strong>de</strong> un coche seríamucho más compleja. La segunda parte <strong>de</strong> la <strong>de</strong>claración <strong>con</strong>tiene los métodos (funciones)que nos van a permitir realizar operaciones o acciones sobre el objeto. En el caso <strong>de</strong> la clasecoche hemos <strong>de</strong>finido un método acelerar() que nos va a permitir acelerar el coche hastauna <strong>de</strong>terminada velocidad. El método frenar() va a hacer que la velocidad sea 0, es <strong>de</strong>cir,que el coche se pare. Esta es la forma en que se implementa un método en C++. Lassiguientes líneas implementan el método frenar() y acelerar().void Coche::frenar() {// Ponemos a 0 el valor <strong>de</strong>l atributo velocidadvelocidad = 0;}144