You are on page 1of 27

C++ - Wikipedia, la enciclopedia libre

http://es.wikipedia.org/wiki/C++

C++
De Wikipedia, la enciclopedia libre C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido. Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma. Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT. Una particularidad del C++ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crear nuevos tipos que se comporten como tipos fundamentales.

C++

Paradigma:

multiparadigma: orientado a objetos, imperativo, programación genérica. 1983 Bjarne Stroustrup Bjarne Stroustrup, Bell Labs fuerte, estático

Apareció en: Diseñado por: Desarrollador: Tipo de dato:

Implementaciones: GNU Compiler Collection (g++), Intel C++ Compiler, Borland C++ Builder, Visual C++, EKOpath, Turbo C++, entre otros. Dialectos: ISO C++, ANSI C++ 1998, ANSI C++ 2003 C, Simula, Ada 83, ALGOL 68, CLU, ML Vala, Ada 95, Java, PHP, D, Perl, C#

Influido por: Ha influido a:

El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.

1 de 27

30/06/11 12:10

C++ - Wikipedia, la enciclopedia libre

http://es.wikipedia.org/wiki/C++

Contenido
1 Un ejemplo de programa en C++, el clásico Hola mundo 2 Tipos de datos 2.1 Tamaños asociados 2.2 wchar_t 2.3 La palabra clave "void" 3 Principios 4 El concepto de clase 4.1 Constructores 4.2 Destructores 4.3 Funciones miembro 4.4 Plantillas 4.4.1 Especialización 4.5 Clases abstractas 4.6 Espacios de nombres 4.7 Excepciones 4.8 Herencia 4.8.1 Herencia simple 4.8.2 Herencia múltiple 4.9 Sobrecarga de operadores 5 Biblioteca estándar de plantillas (STL, Standard Template Library) 6 Biblioteca de entrada y salida 6.1 fstreams 6.2 sstreams 6.3 Contenedores 6.4 Iteradores 6.5 Algoritmos 7 C++0x 8 Diferencias de tipos respecto a C 9 Compiladores 10 Véase también 11 Referencias 12 Enlaces externos

Un ejemplo de programa en C++, el clásico Hola mundo
A continuación se cita un programa de ejemplo Hola mundo escrito en C++:

2 de 27

30/06/11 12:10

a diferencia de C.Wikipedia.org/wiki/C++ // Esta cabecera permite usar los objetos que encapsulan los descriptores stdout y stdin: cout(<<) y cin(>>) #include <iostream> using namespace std. y grosso modo está enviando a cout lo que queremos mostrar por pantalla para que lo pinte. como pueden ser los objetos cout y cin. en este caso la cadena "Hola mundo" . double. Por último tomaremos una secuencia de caracteres del teclado hasta el retorno de línea (presionando ENTER). aunque no se fueran a usar. que representan el flujo de salida estándar (típicamente la pantalla o una ventana de texto) y el flujo de entrada estándar (típicamente el teclado). salvo por la característica de que si main no va a recoger argumentos. } Al usar la directiva #include estamos diciéndole al compilador que busque e interprete todos los elementos definidos en el archivo que acompaña la directiva (en este caso. int main() { cout << "Hola mundo" << endl. Tipos de datos C++ tiene los siguientes tipos fundamentales: Caracteres: char (también es un entero).C++ . El mismo operador << se puede usar varias veces en la misma sentencia. la enciclopedia libre http://es. En este caso hay un espacio de nombres llamado std. return 0. Queda solo comentar que el símbolo << se conoce como operador de inserción. long long int Números en coma flotante: float. Para evitar sobrescribir los elementos ya definidos al ponerles igual nombre. se crearon los espacios de nombres o namespace del singular en inglés. llamando al método get del objeto cin. cuyo resultado será imprimir un retorno de línea. wchar_t Enteros: short int. long double Booleanos: bool 3 de 27 30/06/11 12:10 . de forma que gracias a esta característica podremos concatenar el objeto endl al final. int. Al incluir la sentencia using namespace std le estamos diciendo al compilador que usaremos el espacio de nombres std por lo que no tendremos que incluirlo cuando usemos elementos de este espacio de nombres. iostream). que es donde se incluyen las definiciones de todas las funciones y clases que conforman la biblioteca estándar de C++. donde había que ponerlos explícitamente. La definición de funciones es igual que en C. no tenemos por qué ponérselos.wikipedia. long int.

la enciclopedia libre http://es.Wikipedia. Un tipo unsigned tiene el mismo tamaño que su versión signed. Otras arquitecturas pueden requerir distintos tamaños de tipos de datos primitivos. ambos inclusive. Tamaños asociados Según la máquina y el compilador que se utilice los tipos primitivos pueden ocupar un determinado tamaño en memoria. C++ no dice nada acerca de cuál es el número de bits en un byte. Un tipo int tiene un tamaño entre el de short y el de long. Un tipo short tiene al menos el mismo tamaño que un tipo char. con lo que se consigue un rango mayor de números naturales. Por ejemplo: strcpy .std::wcout 4 de 27 30/06/11 12:10 . una versión para trabajar con wchar_t. sizeof(char) siempre devuelve 1. wchar_t Para la versión del estándar que se publicó en 1998. tanto de C como de C++. más bien. y todos los bits de este espacio deben ser "accesibles". El tamaño reconocido de char es de 1. Es decir. a diferencia del tradicional char. preferentemente el tamaño de un apuntador de memoria de la máquina. ofrece solamente las siguientes "garantías de tipos": Tamaños de tipos primitivos bajo i386 (GCC) Tipo Número de Bits char short int float double 8 16 32 32 64 Un tipo char tiene el tamaño mínimo en bytes asignable por la máquina.org/wiki/C++ Vacío: void El modificador unsigned se puede aplicar a enteros para obtener números sin signo (por omisión los enteros contienen signo).std::wstring std::cout . A su vez. Un tipo long tiene al menos el doble tamaño en bytes que un tipo short. se ha definido para la mayoría de las funciones y clases.wikipedia. que contempla simplemente al código de caracteres ASCII extendido. donde usualmente se prefija el carácter w al nombre de la función (en ocasiones el carácter es un infijo).C++ . se decidió añadir el tipo de dato wchar_t. La siguiente lista ilustra el número de bits que ocupan los distintos tipos primitivos en la arquitectura x86. ni del tamaño de estos tipos. que permite el uso de caracteres UNICODE.wstrcpy std::string .

Indica que memoria es un puntero a alguna parte. La palabra clave "void" La palabra clave void define en C++ el concepto de no existencia o no atribución de un tipo en una variable o declaración. Además se utiliza para determinar que una función no retorna un valor.Wikipedia. donde se guarda información de algún tipo. puede ser usada para destacar que una función no recibe parámetros.wikipedia. Como tal. Una función como la declarada anteriormente no puede retornar un valor por medio de return: la palabra clave va sola. No es posible una declaración del tipo: void t. Una ventaja de la declaración " void *" es que puede representar a la vez varios tipos de datos. wchar_t como: Mientras que en C++ es en sí mismo un tipo de dato.C++ . la forma especial Por ejemplo: void *memoria. como en: void funcion (int parametro). void se comporta de forma ligeramente diferente a como lo hace en C. El programador es responsable de definir estos "algún". especialmente en cuanto a su significado en declaraciones y prototipos de funciones. como en: int funcion (void). void * indica que el tipo de datos es un puntero. la enciclopedia libre http://es. Aunque la tendencia actual es la de no colocar la palabra "void". Cabe destacar que void no es un tipo. dependiendo de la operación de cast 5 de 27 30/06/11 12:10 . //Está mal En este sentido.org/wiki/C++ Cabe resaltar que en C se define typedef unsigned short wchar_t. eliminando toda ambigüedad. Sin embargo.

. pero reflejados sobre la variable env. un flotante. debe incluirse el valor de retorno (por ejemplo. Métodos o funciones 6 de 27 30/06/11 12:10 . en cuyo caso el compilador es responsable de agregar la salida adecuada. bien podría almacenar un entero. y argv. char** argv) int main(int argc. la enciclopedia libre http://es. char** env) La primera es la forma por omisión de un programa que no recibe parámetros ni argumentos.Wikipedia. o salir por medio de la función exit.org/wiki/C++ escogida. char** argv. un puntero a un array de punteros. return 0.C++ . de argc elementos.wikipedia. un número que describe el número de argumentos del programa (incluyendo el nombre del programa mismo). Es responsabilidad del programador recordar qué tipo de datos hay y garantizar el acceso adecuado. La memoria que hemos apuntado en alguna parte. una cadena de texto o un programa. Alternativamente puede dejarse en blanco. definidas en el archivo cstddef). La segunda forma tiene dos parámetros: argc. donde el elemento argv[i] representa el i-ésimo argumento entregado al programa. Según el paradigma de la programación orientada a objetos un objeto consta de: 1. Principios Todo programa en C++ debe tener la función main() (a no ser que se especifique en tiempo de compilación otro punto de entrada. El concepto de clase Véase también: Clase (informática) Los objetos en C++ son abstraídos mediante una clase. El tipo de retorno de main es int . Al finalizar la función main. o combinaciones de éstos. aunque el estándar prevé solamente dos posibles valores de retorno: EXIT_SUCCESS y EXIT_ERROR. que en realidad es la función que tiene el main()) int main() {} La función int main() main debe tener uno de los siguientes prototipos: int main(int argc. en el ejemplo anterior. En el tercer caso se añade la posibilidad de poder acceder a las variables de entorno de ejecución de la misma forma que se accede a los argumentos del programa.

puede haber varios constructores sobrecargados. Su número de patas. cambiar su comportamiento. public: // Constructor Punto(). esas son las funciones de la clase. Su objetivo es llamar a los constructores de los atributos que conforman el objeto a construir. Este es otro ejemplo de una clase: class Punto { //por omisión los miembros son 'private' para que sólo se puedan modificar desde la propia clase. Tomando el ejemplo de la Clase Punto. // Funciones miembro o métodos int ObtenerX(). aunque no es la mejor forma de programar. int y. la enciclopedia libre http://es. private: // Variable miembro privada int id. // Destructor ~Punto(). Constructores Véase también: Constructor (informática) Son unos métodos especiales que se ejecutan automáticamente al crear un objeto de la clase.C++ . Cabe destacar que no es necesario declarar un constructor al igual que un destructor.Wikipedia. }. y poseen el mismo nombre que la clase a la que pertenecen. justo después de la declaración de los parámetros.org/wiki/C++ 2. Al igual que otros métodos. pues el compilador lo puede hacer. Cada perro comparte unas características (atributos). Atributos o Variables Miembro Un ejemplo de clase que podemos tomar es la clase perro. si deseamos que cada vez que se cree un 7 de 27 30/06/11 12:10 . En su declaración no se especifica el tipo de dato que devuelven.. protected: // Variables miembro protegidas int x. Como característica especial a la hora de implementar un constructor. int ObtenerY().wikipedia. Las funciones que lo hagan ladrar.. el color de su pelaje o su tamaño son algunos de sus atributos. se encuentra lo que se llama "lista de inicializadores". aunque no pueden existir constructores virtuales.

2.C++ . es un objeto que vive dentro del scope(las llaves { }) en el que fue creado. Este constructor. Es el constructor que no recibe ningún parámetro en la función. Para que un objeto pueda seguir viviendo cuando se saque de el scope 8 de 27 30/06/11 12:10 . // creamos un elemento de la clase Punto llamado MiPunto // mostramos el valor acumulado en la variable x // mostramos el valor acumulado en la variable y cout << "Coordenada X: " << MiPunto. si no se define. un objeto o variable de otro tipo distinto al suyo propio. cout << "Coordenada Y: " << MiPunto. // Coordenadas del punto // Constructor Punto() : x(0). int main () { Punto MiPunto. y(0){ // Inicializamos las variables "x" e "y" } }.x << endl. Constructor de conversión. el sistema proporcionaría uno predeterminado.Wikipedia. la enciclopedia libre http://es.wikipedia. convierte un objeto de un tipo determinado a otro objeto del tipo que estamos generando. Es necesario para la construcción de estructuras y contenedores de la STL. Al igual que el predeterminado. Es decir. y realiza una copia de los atributos del mismo. Constructor predeterminado. float y. 3.y << endl. return 0.org/wiki/C++ objeto de esta clase las coordenadas del punto sean igual a cero podemos agregar un constructor como se muestra a continuación: class Punto { public: float x. obtenemos una salida que debe ser similar a la siguiente: Coordenada X:0 Coordenada Y:0 Existen varios tipos de constructores en C++: 1. } Si compilamos y ejecutamos el anterior programa. Constructores + Memoria heap Un objeto creado de la forma que se vio hasta ahora. el sistema proporciona uno. Si no se definiera ningún constructor. recibe como único parámetro. Es un constructor que recibe un objeto de la misma clase. Constructor de copia. // Main para demostrar el funcionamiento de la clase # include <iostream> // Esto nos permite utilizar "cout" using namespace std.

//esto llama al contructor que se describe más arriba delete unPunto. Ejemplo: int main() { int *unEntero = new int(12). es cuando éste fue creado mediante el operador new. La invocación del destructor de un objeto que vive en heap se realiza a través del operador delete o delete[] para arreglos. El operador new se utiliza de la siguiente manera: int main() { Punto *unPunto = new Punto(). //asigna un arreglo de 'cuantos' puntos(se llama el constructor que se muestra m } Destructores Véase también: Destructor (informática) Los destructores son funciones miembro especiales llamadas automáticamente en la ejecución del programa. el cual asigna memoria para almacenar al objeto creado.wikipedia. Para esto.Wikipedia. Los destructores son invocados automáticamente al alcanzar el flujo del programa el fin del ámbito en el que está declarado el objeto. y no en la pila de ejecución del programa. Quitar los vínculos que pudiesen tener otros recursos u objetos con éste. Sus principales cometidos son: Liberar los recursos computacionales que el objeto de dicha clase haya adquirido en tiempo de ejecución al expirar éste. } //asignamos //asignamos //liberamos //liberamos un entero en memoria heap con el valor 12 memoria para 25 enteros(no estan inicializados) la memoria que ocupaba unEntero la memoria ocupada por arregloDeEnteros 9 de 27 30/06/11 12:10 . la enciclopedia libre http://es. int *arregloDeEnteros = new int[25]. que éste vive en memoria heap. delete[] arregloDeEnteros. return 0. con el operador new[] se pueden crear arreglo de tamaño dinámico: Punto *asignar(int cuantos) { return new Punto[cuantos].C++ . se lo debe crear en memoria heap. } Además. //no hay que olvidarse de liberar la memoria ocupada por el objeto(ver la secc return 0. El único caso en el que se debe invocar explícitamente al destructor de un objeto. delete unEntero. y por tanto no tienen por qué ser llamadas explícitamente por el programador. es decir.org/wiki/C++ en el que se creó. se utiliza el operador new. y además llama a su constructor(por lo que se le pueden enviar parámetros).

Además. polígonos.Wikipedia. Permiten que una clase o función trabaje con tipos de datos abstractos. La declaración de una plantilla se realiza anteponiendo la declaración template <typename A. con la salvedad de que el compilador realizara el proceso de Decoración de nombre (Name Mangling en inglés): Cambiara el nombre de la función añadiendo un identificador de la clase en la que está declarada. la memoria ocupada por unEntero y arregloDeEnteros respectivamente. Es por esto. Si es privado no se permite la destrucción del objeto por el usuario.wikipedia. según si se declaran: Si es público se llama desde cualquier parte del programa para destruir el objeto.org/wiki/C++ Si no se utilizara el operador delete y delete[] en ese caso... Las funciones miembro se invocan accediendo primero al objeto al cual refieren. lo que no es para nada conveniente.. con la sintaxis: myobject.. estructura o función) 10 de 27 30/06/11 12:10 . y no hay forma de acceder a ella. Existen dos tipos de destructores pueden ser públicos o privados. El uso de destructores es clave en el concepto de Adquirir Recursos es Inicializar. Cuando una porción de memoria queda ocupada por una variable que ya no se utiliza. Son similares a las funciones habituales. pudiendo incluir caracteres especiales o identificadores numéricos. flotantes. Funciones miembro Función miembro es aquella que está declarada en ámbito de clase. En aplicaciones grandes. las funciones miembro reciben implícitamente un parámetro adicional: El puntero this.mymemberfunction(). esto es un claro ejemplo de una función miembro. que el manejo de memoria heap debe usarse conscientemente. si ocurren muchos memory leaks. quedaría ocupada sin sentido.C++ . De esta forma se pueden declarar objetos de la clase de este vector que contengan enteros. que referencia al objeto que ejecuta la función.> a la declaración de la estructura (clase. figuras. es posible construir un vector genérico que pueda contener cualquier tipo de estructura de datos. la enciclopedia libre http://es. Por ejemplo. se denomina un 'memory leak'. el programa puede terminar ocupando bastante más memoria RAM de la que debería. fichas de personal. Plantillas Las plantillas son el mecanismo de C++ para implantar el paradigma de la programación genérica. etc. especificándose más adelante cuales son los que se quieren usar.

Especialización El siguiente ejemplo: template <typename A> int myfunction(A a). int myfunction (std::string a) { return -a. crea una plantilla bajo la cual pueden ser definidas en el código de cabecera cualesquiera funciones especializadas para un tipo de datos como int myfunction(int). }. int myfunction(bool). el compilador intentará "calzar" la plantilla a ese tipo de datos. retorna x.Wikipedia. la enciclopedia libre http://es. no equivalente ("no convertible") corresponde a una especialización. const T &y) { return (x > y) ? x : y. int myfunction (bool a) { return (a & rand()).size(). float. }.) devolverá el mayor de ellos (usando el operador >). //si x > y. o bien generará un mensaje de error si fracasa en ese proceso. Al ejecutar la función con parámetros de un cierto tipo. long. sino retorna y } La función max() es un ejemplo de programación genérica. double.C++ . etc. int myfunction(std::string). y dados dos parámetros de un tipo T (que puede ser int. Todas las definiciones habilitadas de una plantilla deben estar disponibles al momento de la compilación.wikipedia. Si una de estas funciones no fuera definida.org/wiki/C++ deseado. Cada una de estas funciones tiene su propia definición (cuerpo). por lo cual no es posible actualmente "compilar" una 11 de 27 30/06/11 12:10 . o generará un mensaje de error si fracasa en ese proceso. Cada cuerpo diferente. }. Por ejemplo: template <typename T> T max(const T &x. el compilador tratará de aplicar las conversiones de tipos de datos que le fuesen permitidas para "calzar" una de las plantillas. etcétera: int myfunction (int a) { return a + 5.

Por ello.C++ .org/wiki/C++ plantilla como archivo de objeto. 12 de 27 30/06/11 12:10 . las plantillas se distribuyen junto con el código fuente de la aplicación. es decir. Estas definiciones pueden utilizarse sin tener en cuenta la implementación que se hará de ellos.Wikipedia. pero sí es posible. no es posible compilar la plantilla std::vector< > a código objeto. un conjunto de métodos que definen el comportamiento de un módulo determinado. pero sí una clase concreta que implemente los métodos definidos en ella. es una que está diseñada sólo como clase padre de las cuales se deben derivar clases hijas. class ConcretaB : public Abstracta { public: int metodo() { //otra implementación return baz () . } }. la enciclopedia libre http://es. Las clases abstractas son útiles para definir interfaces. compilar un tipo de datos std::vector<std::string>. class ConcretaA : public Abstracta { public: int metodo() { //haz algo return foo () + 2. no es posible instanciar una clase abstracta. por ejemplo. }.wikipedia.5. pero la clase abstracta en sí no contiene ninguna implementación -. o clase base abstracta (ABC). En C++ los métodos de las clases abstractas se definen como funciones virtuales puras.solamente representa los métodos que se deben implementar. Por lo tanto. Clases abstractas En C++ es posible definir clases abstractas. Una clase abstracta. } }. Una clase abstracta se usa para representar aquellas entidades o métodos que después se implementarán en las clases derivadas. class Abstracta { public: virtual int metodo() = 0. En otras palabras. sino simplemente compilar especializaciones de la plantilla.

las cuales son una metodología de flujo de ejecución basada en la prueba del código deseado (try) seguida por la 13 de 27 30/06/11 12:10 . Excepciones C++ permite la existencia de excepciones. std::cout<< mi_valor<< '\n'. Por ejemplo: # include <iostream> // Las funciones en esta cabecera existen dentro del espacio de nombres std:: namespace mi_paquete{ int mi_valor.C++ . siempre y cuando no se produzca alguna ambigüedad o conflicto de nombres. // imprime '4' return 0. que permite acceder a los nombres de variables del paquete deseado en forma directa. Esto permite evitar las ocurrencias de conflictos entre nombres de funciones. mi_paquete::mi_valor= 4. para acceder a la variable del espacio de nombres mi_paquete es necesario acceder específicamente el espacio de nombres.Wikipedia. int main() { int mi_valor= 3. así como las funcionalidades propias de C++ (streams) y los componentes de la biblioteca STL. } Como puede verse. Debe notarse que el = 0 es la notación que emplea C++ para definir funciones virtuales puras.org/wiki/C++ En el ejemplo. el cual almacena todas las definiciones nuevas en C++ que difieren de C (algunas estructuras y funciones). }. la enciclopedia libre http://es. los cuales pueden describirse como áreas virtuales bajo las cuales ciertos nombres de variable o tipos tienen validez.wikipedia. variables o clases. Un atajo recomendado para programas sencillos es la directiva using namespace. // imprime '3' std::cout<< mi_paquete::mi_valor<< '\n'. El ejemplo más conocido en C++ es el espacio de nombres std::. Espacios de nombres Una adición a las características de C son los espacios de nombre (namespace en inglés). las invocaciones directas a mi_valor darán acceso solamente a la variable descrita localmente. la clase ConcretaA es una implementación de la clase Abstracta. y la clase ConcretaB es otra implementación.

del tipo std::out_of_range. se produce la terminación abrupta de éste ("abort"). derivado de std::exception. una excepción. } catch (std::exception& X) { std::cerr<< X. siempre y cuando tengan un tipo de relación especial. 14 de 27 30/06/11 12:10 . un mensaje similar a "Index Out of Range"). en la llamada a la función "at". Por ejemplo: # include <iostream> // Muestra el uso de try y catch int main() { std::string x = "Hola Mundo". Si una excepción se propagara sin ser atrapada por un bloque catch. El tipo de datos std::string arroja en estos casos. la enciclopedia libre http://es. Con ella se pueden crear nuevas clases a partir de clases ya hechas.what()<<std::endl. el cual no existe.wikipedia. Herencia Existen varios tipos de herencia entre clases en el lenguaje de programación C++. La declaración de estas condiciones se hace lanzando (throw) sentencias especiales que son capturadas por el flujo catch correspondiente. try { std::cout<< x.org/wiki/C++ intercepción de ciertas condiciones bajo un flujo de programa adicional (catch). El bloque catch "atrapará" la excepción arrojada como una variable X. } En el ejemplo anterior. Estos son: Herencia simple La herencia en C++ es un mecanismo de abstracción creado para poder facilitar y mejorar el diseño de las clases de un programa. } return 0.C++ . para la cual el método what() muestra un mensaje con la causa del error (en nuestro caso.at(99)<<std::endl. Es buena idea al crear nuevas excepciones derivarlas de std::exception ya que es el bloque catch que muchos programadores colocan por omisión. y llegara hasta el punto de terminación del programa.Wikipedia. se hace el intento de acceder al carácter número 99 de la cadena "Hola Mundo".

public: //Constructores y demás funciones básicas de barco }. un Acorazado ES-UN Barco. nos tenemos que hacer una pregunta. Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario para el uso de las clases). podrían (a la vez que heredan las de barco) añadir cosas propias del subtipo de barco que vamos a crear.Wikipedia. y si tiene sentido. // Elresto de cosas }. Por último. //El resto de cosas }. un Carguero ES-UN Barco.org/wiki/C++ En la herencia. por ejemplo: class Carguero: public Barco { // Esta es la manera de especificar que hereda de Barco private: float carga. Carguero. hay que mencionar que existen 3 clases de herencia que se diferencian en el modo de manejar la visibilidad de los componentes de la clase resultante: 15 de 27 30/06/11 12:10 . entonces estamos ante un posible caso de herencia donde clase A será la clase base y clase B la derivada. etc. Cualquier cosa que tenga visibilidad protected se comportará como pública en la clase Base y en las que componen la jerarquía de herencia. float peso.C++ . y como privada en las clases que NO sean de la jerarquía de la herencia. un Trasatlántico ES-UN Barco. se proporciona un nuevo modo de visibilidad de los datos/funciones: "protected". la enciclopedia libre http://es. Antes de utilizar la herencia. class Acorazado: public Barco { private: int numeroArmas. etc. En este ejemplo tendríamos las cosas generales de un Barco (en C++) class Barco { protected: char* nombre. int Soldados. pudiendo las clases derivadas redefinir estos comportamientos (polimorfismo) y añadir comportamientos nuevos propios de las clases derivadas. las clases derivadas "heredan" los datos y las funciones miembro de las clases base. podemos intentar usar esta jerarquía: Si la frase <claseB> ES-UN <claseA> tiene sentido. y ahora las características de las clases derivadas.wikipedia. Ejemplo: clases Barco. Acorazado.

Hablar(). comer.. la enciclopedia libre http://es. . como persona que es. etc.. AlmacenarStock().. no de una sola clase base. que puede devolverte el cambio. también podrás suponer que tiene un jefe... todo componente publico y protegido de la clase Base. será protegido en la clase Derivada. sino de varias.. pongamos un ejemplo: Cuando ves a quien te atiende en una tienda. y los componentes privados. andar. }. Herencia privada (clase Derivada: private Base) : Con este tipo de herencia todo componente de la clase Base. class Empleado { Persona jefe. Empleado { .. Caminar().. es posible utilizar más de una clase para que otra herede sus características. podrás suponer que puede hablar. class empleado_tienda: public Persona. Por tanto.. }. .org/wiki/C++ Herencia publica (class Derivada: public Base ) : Con este tipo de herencia se respetan los comportamientos originales de las visibilidades de la clase Base en la clase Derivada. Herencia múltiple La herencia múltiple es el mecanismo que permite al programador hacer clases derivadas a partir. }.C++ . pero. será privado en la clase Derivada (las propiedades heredadas serán privadas aunque estas sean públicas en la clase Base) Herencia protegida (clase Derivada: protected Base) : Con este tipo de herencia. Si esto lo trasladamos a la programación sería herencia múltiple (clase empleado_tienda): class Persona { .Wikipedia.wikipedia. como empleado que es. Sobrecarga de operadores 16 de 27 30/06/11 12:10 . Cobrar(). por otro lado. ComprobarExistencias(). Para entender esto mejor. int sueldo. . que puede cobrarte dinero por la compra.. siguen siendo privados.

C++ . salvo que esta tendrá un nombre especial: Tipo dato de devolución operator<token del operador>(parámetros) de Los siguientes operadores pueden ser sobrecargados: Operadores Unarios Operador * (de indirección) Operador -> (de indirección) Operador & (de dirección) Operador + Operador Operador ++ Operador -Operadores Binarios Operador == Operador + Operador Operador * Operador / Operador % Operador << Operador >> Operador & Operador ^ Operador | Operador [] Operador () Operadores de Asignación Operador = Operador += Operador -= Operador *= Operador /= Operador %= Operador <<= 17 de 27 30/06/11 12:10 .wikipedia. Es posible definir el comportamiento de un operador del lenguaje para que trabaje con tipos de datos definidos por el usuario. la enciclopedia libre http://es. se deben cumplir condiciones especiales. entre aquellos que pueden ser sobrecargados. No todos los operadores de C++ son factibles de sobrecargar. En particular. los operadores sizeof y :: no son sobrecargables. Los comportamientos de los operadores sobrecargados se implementan de la misma manera que una función. y.org/wiki/C++ La sobrecarga de operadores es una forma de hacer polimorfismo.Wikipedia. No es posible en C++ crear un operador nuevo.

proporcionan la entrada y salida estándar de datos (teclado/pantalla). además de poder usar las bibliotecas de C. hay dos opciones: si el operador no devuelve nada una sentencia como "A=B=C..B y C de un tipo T y sobrecargamos el operador = para que trabaje con el tipo de datos T. pero si se devuelve un tipo de datos T al implementar el operador.Wikipedia. si este valor es del tipo de datos con el que trabaja el operador. Sin embargo. aunque tendremos que definir el comportamiento de dicha entrada/salida para clases/tipos de datos definidos por el usuario. También está disponible cerr. propia del lenguaje." Biblioteca estándar de plantillas (STL. el uso del operador unario . y los objetos cout y cin. permitiendo algo como "A=B=C=D=. respectivamente. procesado de entrada/salida. si tenemos 3 variables A. Standard Template Library) Los lenguajes de programación suelen tener una serie de bibliotecas de funciones integradas para la manipulación de datos a nivel más básico. Proporciona una serie plantillas (templates) que permiten efectuar operaciones sobre el almacenado de datos. ya que son capaces de adaptarse al tipo de datos que reciben.C++ .. con el objeto de ser útiles en la inserción/extracción de datos a dichos flujos. Los operadores sobrecargados no dejan de ser funciones. permitiría concatenar cuantos elementos se quisieran.org/wiki/C++ Operador Operador Operador Operador >>= &= ^= |= Dado que estos operadores son definidos para un tipo de datos definido por el usuario.debiera cambiar el "signo" de un "valor".. Son operadores inteligentes. Por ejemplo. Por ejemplo. Por ejemplo: 18 de 27 30/06/11 12:10 . Biblioteca de entrada y salida Las clases basic_ostream y basic_stream. En C++. permite el encadenamiento de sentencias. Estas clases tienen sobrecargados los operadores << y >>. la enciclopedia libre http://es. se considera de primera importancia que las semánticas sean tan parecidas al comportamiento natural de los operadores como para que el uso de los operadores sobrecargados sea intuitivo.wikipedia. similar a cout. por lo que pueden devolver un valor. éste es libre de asignarles cualquiera semántica que desee. se puede usar la nativa STL (Standard Template Library)." (sin las comillas) daría error. usado para la salida estándar de errores.

org/wiki/C++ ostream& operator<<(ostream& fs.close().ios::in). fstreams Tipo de flujo para el manejo de ficheros.C++ .ofstream y fstream. indicando el número de dígitos decimales a mostrar.y. La definición previa de ostreams/istreams es aplicable a este apartado.open("nombre_fichero.x << ". para abrirlo en modo escritura.const Punto& punto) { return fs << punto. solo habría que realizar la siguiente expresión: //. (nombrevariablefichero). Existen tres clases (ficheros de lectura. Punto p(4.txt". de escritura o de lectura/escritura): ifstream.close(). Ejemplo: f... Como abrir un fichero: (nombre_variable_fichero). etc. para mostrar un punto.. Es posible formatear la entrada/salida. Leer un fichero: 1-Si es fichero de texto plano: 19 de 27 30/06/11 12:10 .Wikipedia. Como cerrar el fichero: nombre_variable_fichero.ios::in)...open("nombre_fichero.ios::out).dat/txt"." << punto. si los textos se pasarán a minúsculas o mayúsculas.5).open("datos. Ejemplo: f. //.. cout << "Las coordenadas son: " << p << endl. para abrirlo en modo lectura.wikipedia.dat/txt". si los números recibidos están en formato octal o hexadecimal. } De esta forma. la enciclopedia libre http://es. //.

int main() { ifstream entrada.sizeof(int)).sizeof(int)).write((char*)&nombre_variable.read((char*)&e. donde "texto" puede ser también una variable de cualquier tipo pri Ejemplo: f<<HOLA. string unString.sizeof(tipo_variable)). Ejemplo: f. return 0.sizeof(tipo_variable)). while(entrada >> unString) cout << "Lei: " << unString << endl. Pueden abrirse pasando al constructor los parámetros relativos a la ubicación del fichero y el modo de apertura: 20 de 27 30/06/11 12:10 .read((char*)&nombre_variable. entrada. Escribir un fichero: 1-Si es fichero de texto(.C++ . } 2-Si es un fichero binario(.txt"). la enciclopedia libre http://es. nombre_variable_fichero. nombre_variable_fichero.org/wiki/C++ #include <fstream> #include <string> #include <iostream> using namespace std. Ejemplo: f.write((char*)&e.Wikipedia.txt): nombrevariable<<"texto".wikipedia. 2-Si es un fichero binario(.dat).open("textoPlano.dat).

Para agregar elementos al final del vector. la enciclopedia libre http://es. Tratan a una cadena como si de un flujo de datos se tratase. Los vectores nos permiten acceder a cualquier elemento que contenga. ostringstream e istringstream. Contenedores Son clases plantillas especiales utilizadas para almacenar tipos de datos genéricos. una vez que se declaran para contener un tipo de dato determinado. Por otro lado. por lo que se debe ser cuidadoso al utilizar este operador. solo se podrán meter elementos de ese tipo. Debe tenerse en cuenta que si se intenta acceder a una posición que excede los límites del vector.wikipedia. sean cuales sean. s >> nombre >> edad >> estatura >> p.org/wiki/C++ sstreams Se destacan dos clases. e istringstream puede extraer la información contenida en una cadena (pasada como parámetro en su constructor) con el operador >>." << punto(5. en ese contenedor. Todo lo anteriormente dicho es aplicable a estas clases.C++ . es decir. infinitos elementos. este no hará ningún chequeo. ostringstream permite elaborar una cadena de texto insertando datos cual flujo. se puede utilizar el método at(int). Para asegurar un acceso seguro al vector. que lanza una excepción de tipo std::out_of_range en caso de que esto ocurra. se debe usar el método pop_back(). disponemos de varios tipos: Vectores: Se definen por vector<tipo_de_dato> nombre_del_vector.str().Wikipedia. 21 de 27 30/06/11 12:10 ." << edad << ". cout << s. Ejemplos: ostringstream s. se utiliza el método push_back(const T&). mediante el operador[]. istringstream s(cadena)." << estatura << ". Son arreglos que se redimensionan automaticamente al agregar nuevos elementos.6) << endl. s << nombre << ". Según la naturaleza del almacenado. Todos los contenedores son homogéneos. para eliminar un elemento del final del vector. por lo que se le pueden agregar "teóricamente".

Contenedores asociativos: map y multimap. intDeque.Wikipedia. //imprime 25 intVector. //libreria que contiene a la clase vector int main() { vector<int> intVector.push_front(25). que permiten asociar una "clave" con un "valor".size() << " elementos.push_back(32). #include <deque> using namespace std. mientras que 22 de 27 30/06/11 12:10 . La diferencia con las colas dobles.push_back(12).push_back(25)." << endl." << endl. Adaptadores de secuencia.org/wiki/C++ #include <vector> #include <iostream> using namespace std. map no permite valores repetidos. //imprimirá 1 return 0. la enciclopedia libre http://es. } //libreria de deques Listas: Son eficientes a la hora de agregar elementos. se agregan los métodos push_front(const T&) y pop_front().pop_back().size() << " elementos. while(intDeque. //agrego el entero 32 al vector cout << "El primer elemento es: " << intVector[0] << endl. //elimina el ultimo elemento del vector(osea 32) cout << "Ahora tengo: " << intVector.size()) intDeque.C++ . //borra todos los elementos return 0. //crea un vector de enteros(sin elementos) intVector. //imprime el primer elemento(retornado p intVector. pero en el comienzo de la cola.front() << " y mi vector tiene " << intVector. pero tienen mejor eficiencia para agregar o eliminar elementos en las "puntas". intDeque. que realizan lo mismo que los ya explicados. //agrega el entero 25 al vector cout << "El primer elemento es: " << intVector.pop_back(). } Colas dobles: son parecidas a los vectores. Además de los métodos push_back(const T&) y pop_back(). deque<tipo_de_dato> nombre_de_la_cola. es que son mas eficientes para eliminar elementos que no estén en alguna de las "puntas" list<tipo_de_dato> nombre_de_la_lista. int main() { deque<int> intDeque.wikipedia.

comprensión y mantenimiento. intAString[1] = "uno". Stepanov y sus colaboradores tuvieron que desarrollar el concepto de iterador como elemento o nexo de conexión entre ambos. y los operadores (algoritmos) que deben operar sobre ellas son también genéricos (funciones genéricas). tipo_de_dato> nombre_del_map. intAString[10] = "diez". return 0. la cual simplemente copia variables desde un lugar a otro. la enciclopedia libre http://es. El nuevo concepto resulta ser una especie de punteros que señalan a los diversos miembros del contenedor (punteros genéricos que como tales no existen en el lenguaje). string> intAString. y cuyo objetivo es "parametrizar" las operaciones en que estas funciones se ven involucradas de modo que su lectura. } Contenedores asociativos: set y multiset. int main() { map<int. multimap<tipo_de_llave. cout << "En intAString[10]: " << intAString[10] << endl.Wikipedia. Un iterador es un tipo de dato que permite el recorrido y la búsqueda de elementos en los contenedores. cout << "En intAString[1]: " << intAString[1] << endl. tipo_de_dato> nombre_del_multimap.org/wiki/C++ multimap si. Más estrictamente. Algoritmos Combinando la utilización de templates y un estilo específico para denotar tipos y variables.C++ . sin la necesidad de garantizar un ordenamiento particular de los elementos que contienen. Un ejemplo es la función copy. sean más fáciles de realizar. Como las estructuras de datos (contenedores) son clases genéricas. #include <map> //libreria que contiene a map y multimap #include <string> //libreria de strings #include <iostream> //libreria de entrada/salida using namespace std. que ofrecen solamente la condición de "pertenencia".wikipedia. copia los contenidos cuyas ubicaciones están 23 de 27 30/06/11 12:10 . map<tipo_de_llave. Iteradores Pueden considerarse como una generalización de la clase de "puntero". la STL ofrece una serie de funciones que representan operaciones comunes.

C++ . desde donde y hasta donde se quiere ordenarlo. que retornan el máximo o mínimo entre dos valores. el vector tiene 60. ordena cualquier tipo de contenedor. max (variable1. arreglo ordenado. son copiados a un lugar descrito o apuntado por inicio_destino. que simplemente intercambia los valores de variable1 y variable2. variable2). es el sort.54. ahora tiene 12. C++0x C++0x es el nombre no oficial del nuevo estándar para el lenguaje de programación C++. excluyendo el dato ubicado en este último. algunos incluso tienen versiones específicas para operar con ciertos iteradores o contenedores.begin(). siempre y cuando se le pasen como argumentos. fin.push_back(54). Un algoritmo muy importante que viene implementado en la librería STL. Los algoritmos son muy variados. De este modo. El algoritmo sort. estas versiones preliminares son conocidas como C++98 y C++03. valor) que busca valor en el espacio de variables entre inicio y fin. La sintaxis es: copy (inicio_origen.12. se ordenaria de la misma manera.54 sort(intVector. en vez de hacerlo paso a paso explícitamente. fuese una deque. //para este momento. y proveen un nivel de abstracción extra que permite obtener un código más "limpio".end()).push_back(60). etcétera. */ } Entre las funciones más conocidas están swap (variable1. intVector.Wikipedia. que "describe" lo que se está haciendo. find (inicio. todos los datos que están entre inicio_origen y fin_origen. al espacio indicado por un tercer iterador. fin_origen.wikipedia. intVector.push_back(12).org/wiki/C++ delimitadas por dos iteradores. variable2). #include <vector> #include <deque> #include <algorithm> int main() { vector<int> intVector. Se planea que reemplace el estándar actual (ISO/IEC 14882). inicio_destino). intVector. //listo. la enciclopedia libre http://es.60 /*Notar que si en vez de un vector. intVector. El nuevo estándar incluirá adiciones al núcleo del lenguaje y 24 de 27 30/06/11 12:10 . que fue publicado en 1998 y actualizado en 2003. variable2) y su símil min (variable1.

entonces las dos condiciones establecidas previamente deben aplicar para cada tipo de dato constituyente. el compilador de Borland C++. ahora son sujetos a sobrecarga. entre otros.C++ .org/wiki/C++ extenderá la biblioteca estándar. que engloba varios compiladores para distintos lenguajes). Como tales. cualquier tipo de datos que sea declarado completo (fully qualified . el compilador de Visual C++. y. Compiladores Uno de los compiladores libres de C++ es el de GNU. el compilador g++ de MinGW.6 Diferencias de tipos respecto a C En C++. Véase también 25 de 27 30/06/11 12:10 . Los tipos enumerados. Si T es un tipo compuesto. sino que son tipos de datos únicos en C++. siendo ya soportado por GCC 4. Otros compiladores comunes son Intel C++ Compiler. el compilador debe conocer el resultado de sizeof(T)). Las condiciones para que un tipo de datos T sea declarado completo son a grandes rasgos las siguientes: Es posible al momento de compilación conocer el espacio asociado al tipo de datos (es decir. o es una clase derivada. o cualquier combinación de las anteriores. esto significa que cualquier tipo de datos definido haciendo uso de las cabeceras completas. en inglés) se convierte en un tipo de datos único. y un destructor. la enciclopedia libre http://es. El más reciente bosquejo publicado. el compilador de CodeWarrior C++. El Miércoles 30 de Marzo del 2011 se publicó este nuevo estándar. conversiones implícitas. fue en junio de 2009. es un tipo de datos completo. el compilador G++ (parte del proyecto GCC.Wikipedia. mientras que en C funcionaba en algunos casos como un alias para alguna clase de dato de tipo entero.wikipedia. bien declarados. El tipo de datos bool . el compilador g++ de Cygwin. igualmente. pasa a ser un tipo de datos único. a diferencia de lo que ocurría en C. los tipos definidos por medio de struct o enum son tipos completos. etcétera. T Tiene al menos un constructor. ya no son simplemente alias para tipos enteros. Carbide. En particular. entonces. o es la especificación de una plantilla. el compilador de Xcode.c++. En general.

1998.html) Traducción al castellano del libro de Bruce Eckel: "Thinking in C++" C++ paso a paso (http://gplsi.es/libros/cpp1/) Libro que explica paso a paso los conceptos de programación orientada a objetos del lenguaje C++ 26 de 27 30/06/11 12:10 .cplusplus. también incluye explicaciones sencillas para aprender el lenguaje de programación Pensar en C++ (http://arco. Addison-Wesley Pub Co. ISBN 84-7829-019-2 Bjarne Stroustrup.conclase. (1 de enero de 1990). El lenguaje de programación C++.esi.cpan.gruposyahoo.com) Inline::CPP (http://search.dlsi.org/perldoc?Inline::CPP) Módulo Perl en CPAN para programar en C++ dentro de programas Perl (en inglés) Curso de C++ (http://c. ISBN 0-201-54330-3 Margaret A. la enciclopedia libre http://es. Madrid. ISBN 0-201-51459-1 Enlaces externos Tutoriales de C++ en español (http://programandoideas.com/2011/02 /tutoriales-c/) plantillas en c++ (http://virtuosonicplusplus. Addison-Wesley Pub Cp.(solo miembros) cplusplus resources (http://www.com.wikipedia. ISBN 0-201-70073-5 Bjarne Stroustrup.es/~david.php) Completo curso de C++ gratuito. The Annotated C++ Reference Manual.html) tutorial para principiantes sobre plantillas Desarrollo de Software en C/C++ (http://www.blogspot. Addison-Wesley Pub Co.com) C/C++ Programming (http://cprogramming. The C++ Programming Language.C++ .Wikipedia. Addison Wesley. docentes y estudiantes.net/curso/index. en castellano.com/2011/04 /plantillas-en-c-templates. Primera edición (29 de marzo de 1994).ar/group /DesarrolloC) Comunidad virtual para el intercambio de información en castellano sobre desarrollo de software en C/C++ para profesionales practicantes.villa/pensarC++. The Design and Evolution of C++. que además de referencia. Ellis y Bjarne Stroustrup.com/) (inglés) C/C++ Reference (http://cppreference. Tercera edición (15 de febrero de 2000).uclm.org/wiki/C++ C C# Java Vala Pascal Objective-C Python Referencias Bjarne Stroustrup.ua.

a las 04:41.Wikipedia. Lee los términos de uso para más información.wikipedia. la enciclopedia libre http://es.C++ .org/wiki/C++ Obtenido de «http://es. El texto está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3. podrían ser aplicables cláusulas adicionales. 27 de 27 30/06/11 12:10 .org/wiki/C%2B%2B» Categoría: C++ Esta página fue modificada por última vez el 30 jun 2011.0.wikipedia.