P. 1
buenuso

buenuso

|Views: 0|Likes:
Published by Hector Villa

More info:

Published by: Hector Villa on Nov 28, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

10/12/2014

pdf

text

original

Gu´ de Buen Uso de C++ ıa

Algoritmos y Estructuras de Datos III - FCEN - UBA http://www.dc.uba.ar/people/materias/aed3/homepage.html

Introducci´n o
Una gu´ sobre c´mo usar correctamente C++ para implementar, dif´ ıa o ıcilmente sea completa. La presente gu´ tiene por finalidad mostrar un costado del C++ ıa muchas veces desconocido para quien reci´n comienza a usarlo. e C++ es un lenguaje basado en el lenguaje C. Lo que hace es brindar la posibilidad de usar clases que el C no tiene. Lo primero que debe hacerse es asimilar la idea de que con C++ algunas cosas deber´ hacerse distintas de ıan como se har´ en C. ıan La gu´ contiene esencialmente ejemplos y comparaciones de situaciones haıa bituales. En los ejemplos hay un “// Antes en C ” cuando se trata de c´digo o que ya no deber´ usarse en C++. ıa

Buen uso
Comentarios en el c´digo o Los comentarios son imprescindibles en cualquier lenguaje de programaci´n. o En el caso de C++ conviene poner un comentario en la declaraci´n de la clase. o Adem´s, es muy recomendable poner un comentario en la declaraci´n de atriba o utos (variables) y m´todos (funciones) de la clase. e Como ejemplo se puede ver el c´digo que hay en el ejemplo de ocultamiento. o Separaci´n de los header files o Para evitar inclusiones repetidas y recompilaciones una buena pr´ctica es a tener separado el header del contenido de la clase. Recordemos que las clases propias deber´ incluirse usando comillas (#include "miclase" ) en cambio ıan las del lenguaje se incluyen con corchetes angulares (#include <string>). Ocultamiento de la representaci´n o Una de las buenas cosas que provee el C++ es la capacidad de ocultar la representaci´n de la clase. Esto se logra clasificando atributos y m´todos en las o e siguientes categor´ ıas: • private: (privado) para que s´lo sea visible por la clase o • protected: (protegido) para que sea visible por la clase y las clases descendientes. • public: (p´blico) para que sea visible desde cualquier clase. u

1

/** define la coordenada Y */ void setY(double y).Conviene que los atributos de la clase sean privados.h" double Punto::getX() { return m coordX. #endif Ejemplo de ocultamiento: Punto. #ifndef #define Punto h Punto h /** * Representa un punto en el plano */ class Punto { private: /** coordenada X */ double m coordX. hay que definir un getter (un m´todo que permite observar el e contenido) y un setter (un m´todo que permite modificar el contenido). e Para evitar confusi´n conviene distinguir de alguna manera las variables de o instancia de las locales de los m´todos. /** coordenada Y */ double m coordY. cuando corresponda. para evitar llevar a un objeto a un estado inconsistente. }. Por tal motivo para cada atributo.h #include "Punto. } void Punto::setX(double x) { m coordX = x. public: /** devuelve la coordenada X */ /** define la coordenada X */ void setX(double x). por ejemplo “m” o “m ”. /** devuelve la coordenada Y */ double getY(). } 2 . Una posibilidad podr´ ser anteponer e ıa un prefijo a las variables de instancia.

como en el ejemplo a continuaci´n. a Memoria din´mica a Para reemplazar a malloc y free se usan new y delete.cpp Makefile En todos los proyectos conviene tener un archivo integrador que diga c´mo o debe compilarse el proyecto.double Punto::getY() { return m coordY. Conviene usar este tipo en vez de enteros. Un error que debe evitarse es pedir u memoria con new e intentar devolverla con free. sobre todo si el proyecto es mantenido por varias o personas. } void Punto::setY(double y) { m coordY = y. Tiene 2 constantes: true y false. No es recomendable hacer asignaciones dentro de comparaciones. Puede ser un Makefile. Veamos un ejemplo. a o 3 . Constantes Se incluye la posibilidad de declarar constantes usando const. que es el tipo bool. Bool Afortunadamente en C++ se incluye el tipo equivalente al boolean de Pascal o Java. Es f´cil a que esto lleve a confusi´n. } Ejemplo de ocultamiento: Punto. o un archivo de proyecto. En vez de usar el preprocesador para hacer los reemplazos: // Antes en C #define MAX SEMANAL 300 simplemente se define una constante: const int MAX SEMANAL = 300. Tambi´n pueden pedirse e arrays de memoria din´mica. Es imprescindible tener presente que durante la ejecuci´n del programa por cada new que se hizo o en alg´n momento debe hacerse un delete. Para ver el uso de const podemos ver el ejemplo de memoria din´mica.

i < MAX CANTIDAD. printf("%d%d\n". } 4 . } void e swap viejo() { int a = 1. a.#include <iostream> #include <string> using namespace std. */ void swap viejo(int* x.1] + *palote. for (int i = 1. string *strVec = new string[MAX CANTIDAD]. void e memdinamica() { string *palote = new string("). *x = *y. Hecho con punteros. en C++ s´ pueden pasarse objetos por ıa ı referencia. *y = z. } delete[] strVec. i++) { strVec[i] = strVec[i . } Ejemplo de memoria din´mica: e memdinamica. int b = 2. b).h> /** * Intercambia dos enteros. &b). strVec[0] = *palote. cout << strVec[0] << endl. cout << strVec[i] << endl. Veamos el siguiente ejemplo: // Antes en C #include <stdio. const int MAX CANTIDAD = 10.cpp a Uso de referencias A diferencia de como se hac´ en C. int* y) { int z = *x. delete palote. swap viejo(&a.

y = z.// Ahora en C++ #include <iostream> using namespace std. } Ejemplo de pasaje de par´metros por referencia: e swap. x = y.cpp a Templates C++ permite definir clases param´tricas. /** * Intercambia dos enteros. */ void swap(int& x. Hecho con pasaje de parametros por referencia. } void e swap() { int a = 1. public: /** Muestra el valor del contenido. b). swap(a. int& y) { int z = x. /** Cambia el valor del contenido. Veamos un ejemplo: #ifndef #define Capsula h Capsula h /** * Es un ejemplo de una Capsula. */ template <class T> class Capsula { private: T m contenido. cout << a << b << endl. int b = 2. template <class T> T Capsula<T>::get() { 5 . Se usan ampliamente en las Stane dard Libraries. }. */ void set(T c). */ T get().

• s[a] : devuelve el char de la posici´n a en el string s.b) : devuelve un string copia del substring de s determinado desde a. • s + t: Devuelve un nuevo string que resulta de copiar s y concatenar t atr´s.substr(a. #include <iostream> #include <string> using namespace std. cout << str. con un NULL terminador al final. } #endif Ejemplo de template: Capsula. o • s. */ void e string() { string str = "Hello World!". contando b caracteres.substr(0. Veamos un ejemplo de lo que se puede hacer con strings. } template <class T> void Capsula<T>::set(T c) { m contenido = c. o Las Standard Libraries (STL) Strings En C un string se toma como un puntero a char.h. 6 . En un template no debe separarse la declaraci´n de la clase del cuerpo debido o a que el preprocesador completa el template en el momento de la compilaci´n. Algunos m´todos utiles: e ´ • s. /** * Ejemplo de uso de string. a • s = t: Hace una copia de t y se la asigna a s. 5) << endl.return m contenido. Tal vez string es una de las clases m´s a usadas. En C++ esto se ha mejorado. //muestra ”World!”.length() : cantidad de caracteres del string s. //muestra ”Hello”.

cpp Streams Los streams (stream es corriente o flujo) son muy usados en C++ . cout << str. //muestra la longitud."<< endl. string& s) { out << i << ’\t’ << s << endl. 7 . tambi´n se puede acceder e a archivos mediante streams. es decir ”!”. esto es ”12”. /** * Agrega un numero de linea i a un renglon s y lo muestra por out.cpp"). } Ejemplo de string: e string. //muestra el ultimo caracter. int i. */ void muestraConNumero(ostream& out. y tienen un comportamiento an´logo al de los usados por los sistemas operativos.length() << endl. * Esta funcion muestra el contenido del archivo e stream. Veamos un ejemplo de un programa que muestra su propio c´digo fuente: o #include <fstream> #include <iostream> #include <string> using namespace std. */ void e stream() { ifstream in("e stream.1] << endl.cout << str. if (in. a Al igual que en Unix se tiene la consola con: • cout: standard output • cin: standard input • cerr: standard error Pero no solo se puede manejar el flujo de consola.fail()) { cout << "No puedo abrirme. cout << str[str.substr(6) << endl. } /** * Ejemplo de uso de stream.cpp.length() .

fail()) { muestraConNumero(cout. • v = w : hace una copia de w y la guarda en v. if (!in.s). Veamos algunos m´todos bastante utiles: e ´ • v. } } } Ejemplo de streams con archivos: e stream. getline(in .size().cpp.fail(). getline(in.size(): tama&ntilde.size() . while (!in. i++) { out << vecEjemplo[vecEjemplo.fail()) { vecEjemplo. i++) { string s. Vectores El vector de C++ permite agregar elementos al comienzo y al final. s).fail()) { string s.i] << endl. s). } } for (int i = 0. if (!in. i. } } 8 .o del vector v • v[i]: i-´simo elemento del vector v e • v. } for (int i = 0.1 .push back(s). i < vecEjemplo. #include #include #include #include <fstream> <iostream> <string> <vector> using namespace std.push back(e) : agrega el elemento e al final del vector v. !in. ostream &out) { vector<string> vecEjemplo. /** * Toma un texto e invierte el orden de sus lineas */ void invertirLineas(istream &in.} else { cout << "Soy asi:"<< endl.

vector<int>::iterator itvec. */ void e vector() { ifstream in("e vector. invertirLineas(in.cpp Iteradores En C++ los contenedores tienen iteradores.push back(i * i). ++itvec) { cout << ’ ’ << *itvec. } Ejemplo de vector: e vector. a En otras versiones de C++ el siguiente fragmento evitar´ la compilaci´n del ıa o programa: 9 . podr´ ıamos iterar sobre el vector. Si quisi´ramos e ver los elementos de un vector. itvec != vec. i++) { vec.cpp Diferencia de versiones Lamentablemente hay varias versiones de C++ que son muy similares pero no completamente compatibles.end(). } cout << endl. void e iterador() { vector<int> vec. i < 5. los cuales permiten ir recorriendo la estructura secuencialmente como si se tratase de una cinta. se arranca la cinta (con begin()) y se va avanzando (con ++) hasta llegar al ultimo elemento (determinado por end()). } Ejemplo de uso de iteradores: e iterador. cout). for (itvec = vec. // Se carga el vector con los primeros 5 cuadrados. Uno de los m´s aceptados es el ANSI C++. } // Y ahora se itera por el vector para mostrarlo. en vez de ir proyectando la componente i-´sima e del vector./** * Ejemplo de uso de vector.begin().cpp"). for (int i = 0. ´ #include <iostream> #include <vector> using namespace std. Primero se crea y asocia el iterador.

net/Books/TICPP/ThinkingInCPP2e.. 1997.. Volumen 1 y 2. Inc.0. i++) { << i << endl.html (J.html • Bruce Eckel.com/∼bs/C++. 2001.for (int i cout } for (int i cout } = 0.mindview.research. for (.M. i < 5. 2002-04-24. “Thinking in C++”.att. Para eso un posible parche es definir un nuevo for.. Revision 4. Second edition. El problema est´ en que esas versiones expanden el for de la siguiente mana era: int i = 0. i < 10. i++) { << i << endl. http://www. i++) . = 5. con el problema solucionado de esta manera: #define for if (true) for #include <iostream> using namespace std. “The C++ Programming Language”. i < 10. i++) { << i << endl. Chuck Allison. MindView. = 5. http://www. Addison-Wesley. Ejemplo de diferencia con el for: e for. i < 5. Third edition. void e for () { for (int i cout } for (int i cout } } = 0. i < 5.cpp Referencias • Stroustrup. 2002-12-31) 10 . Bjarne. i++) { << i << endl.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->