2. ¿Qué es C++?
C++ es un lenguaje de programación, creado a mediados de 1980 por Bjarne
Strousstrup, como extensión del lenguaje C. Este lenguaje abarca tres paradigmas
de la programación:
1. Programación Estructurada
2. Programación Genérica
3. Programación Orientada a Objetos
3. C++
• En la actualidad, C++ es un lenguaje versátil, potente y general. Su éxito entre los
• programadores le ha llevado a ocupar el primer puesto como herramienta de
desarrollo de
• aplicaciones, ya sea en Windows o GNU Linux, que es el sistema operativo en el
cual basaremos este tutorial.
4. C++ en un entorno Linux
Comenzaremos diciendo que los programas se pueden escribir en cualquier editor
de textos
de GNU, entre ellos se encuentran emacs, vim, kate, gedit, nan, guardando dichos
archivos
con extensión .cpp, los cuales serán compilados en GNU/linux utilizando el
compilador GNU
de C++, llamado gcc que puede compilar C, C++, y que además se apega al estándar
ANSI,
permitiendo la portabilidad de estos códigos. Dicho compilador se invoca con el
comando gcc.
5. Estructura de un programa
en C++
Para darnos una idea chequemos el siguiente programa
//Mi primer programa en C++
# include <iostream>
using namespace std;
int main (){
count << "hello World";
return 0;
}
6. C++
• El programa anterior es típico de los programadores aprendices, el resultado de
su impresión
• en pantalla es la frase:
• ”hello Word”
• Es uno de los más simples programas que pueden estar escritos en C + +, pero ya
contiene
• los componentes fundamentales que todos los programas escritos en C + +.
Vamos a ver
• línea por línea en el código lo que hemos escrito:
7. Variables Y Tipos De Datos
Una variable es un espacio de memoria reservado en el
ordenador para contener valores que pueden cambiar
durante la ejecución de un programa. Los tipos que se le
asignen a estas determinan cómo se manipulará la
información contenida en ellas. Cada variable necesita un
identificador que la distingue de las demás. Un identificador
válido es una secuencia de una o más letras, dígitos o
guiones bajos, recordando que no deben coincidir con
palabras reservadas del lenguaje, deben comenzar por una
letra y además tomar en cuenta que C++ hace diferencia
entre mayúsculas y minúsculas.
8. • Las variables que se pueden presentar en un programa son de los
siguientes tipos:
• 1. Variables Locales . Se definen solo en bloque en el que se vayan a
ocupar, de esta manera evitamos tener variables definidas que
luego no se utilizan.
• 2. Variables Globales. No son lo más recomendable, pues su
existencia atenta contra la comprensión del código y su
encapsulamiento.
• 3. Variables estáticas. Se tienen que inicializar en el momento en
que se declaran, de manera obligatoria.
9. • Ahora hablemos de los tipos de datos que reconoce C++. Estos definen el
modo en que se usa el espacio (memoria) en los programas. Al especificar
un tipo de datos, estamos indicando al compilador como crear un espacio
de almacenamiento en particular, y también como manipular este espacio.
Un tipo de dato define el posible rango de valores que una variable puede
tomar al momento de ejecución del programa y a lo largo de toda la vida
útil del propio programa.
• Los tipos de datos pueden ser predefinidos o abstractos. Un tipo de dato
predefinido es intrínsecamente comprendido por el compilador. En
contraste, un tipo de datos definido por el usuario es aquel que usted o
cualquier otro programador crea como una clase, que comúnmente son
llamados tipos de datos abstractos.
10. Los tipos de datos más comunes
en C++ son:
Tipo De Dato Espacio en
Memoria
Rango
unsigned char 8 bits 0 a 255
char 8 bits -128 a 127
short int 16 bits -32,768 a 32,767
unsigned int 32 bits 0 a 4,294,967,295
int 32 bits -2,147,483,648 a
2,147,483,647
unsigned long 32 bits 0 a 4,294,967,295
enum 16 bits -2,147,483,648 a
2,147,483,647
long 32 bits -2,147,483,648 a
2,147,483,647
11. ¿Pero que es el lenguaje C?
• C es un lenguaje de propósito general, procedimental e imperativo desarrollado
en 1972 por Dennis Ritchie en Bell Labs para el sistema operativo Unix.
• Acceso de bajo nivel a la memoria
• Construcciones de lenguaje cerca de las instrucciones de la máquina
• Se usa como un "ensamblador independiente de la máquina"
12. • Una "C mejor" (http://www.research.att.com/~bs/C++.html)
• que admite:
• Programación de sistemas
• Programación orientada a objetos (clases y herencia)
• Programación en el tamaño grande (espacios de nombres, excepciones)
• Programación genérica (plantillas)
• Reutilización (bibliotecas de clases y plantillas grandes)
13. C VS C++
• La mayoría de los programas C también son programas C ++.
• Sin embargo, los buenos programas de C ++ generalmente no se parecen a C:
• evitar macros (usar en línea)
• evitar punteros (usar referencias)
• evite malloc y free (use new y delete)
• evitar arreglos y char * (usar vectores y cadenas) ...
• evitar estructuras (usar clases)
14. C VS C++
• C ++ fomenta un estilo diferente de programación:
• evitar la programación de procedimientos
• modele su dominio con clases y plantillas
15. Objetivos de diseño C ++
•"C con clases", diseñado por Bjarne
Stroustrup a principios de los 80:
•Originalmente un traductor a C
•Inicialmente difícil de depurar e ineficiente
•Mayoría de la extensión compatible hacia
arriba de C
16. • "Tan cerca de C como sea posible, pero no más cerca"
• Una comprobación de tipo más fuerte
• Soporte para programación orientada a objetos
• Eficiencia en tiempo de ejecución
• Primitivas del lenguaje cerca de las instrucciones de la máquina
• Costo mínimo para nuevas características
17. Diseño de memoria
• int i;
• int * iPtr; // un puntero a un entero
• iPtr = & i; // iPtr contiene la dirección de I
• * iPtr = 100;
18. Referencias vs Punteros
• Las referencias deben preferirse a los punteros, excepto cuando:
• manipular objetos dinámicamente asignados
• nuevo devuelve un puntero de objeto
• una variable debe abarcar un conjunto de objetos
• usa un puntero para caminar por el set
19. C++ CLASSES
• Las clases de C ++ se pueden crear de forma automática (en la pila):
• o dinámicamente (en el montón)
21. • Puede compilar todo junto a mano: c++ helloWorld.cpp -o helloWorld
• O puede usar un Makefile para administrar dependencias: helloWorld :
helloWorld.cpp
• c++ $@.cpp -o $@
• O podría usar cdt con eclipse para crear un proyecto estándar de make gestionado
24. ¿Por qué OCF?
• Si no define estas cuatro funciones miembro, C ++ las generará:
• Constructor predeterminado
• llamará al constructor predeterminado para cada miembro de datos
• incinerador de basuras
• llamará al destructor de cada miembro de datos
• copia constructor
• copiará poco a poco cada miembro de datos
• los punteros se copiarán, ¡no los objetos apuntados!
• asignación
• copiará poco a poco cada miembro de datos
25. Ejemplo: una clase de cadena
•Nos gustaría una clase String que proteja las
cadenas estilo C:
•las cadenas son indistinguibles de los
punteros de char
•las actualizaciones de cadena pueden dañar
la memoria
26. • Las cadenas deben apoyar:
• creación y destrucción
• inicialización de matrices de caracteres
• proceso de copiar
• indexación segura
• concatenación segura y actualización
• salida
• longitud y otras operaciones comunes ...
33. Algunas observaciones ...
• Debemos definir un constructor de copia, ... ¡si no las copias de Strings
compartirán la misma representación!
• ¡Modificar uno modificará el otro!
• ¡Destruir uno invalidará al otro!
34. •Debemos declarar copy como const, ...
sino no podremos construir una copia de
una cadena const!
•Solo las operaciones const (inmutables)
están permitidas en los valores de const
35. •Debemos declarar la copia como String &,
not String,? ... sino se hará una nueva copia
antes de pasarla al constructor.
•Los argumentos de funciones siempre pasan
por valor en C ++
•¡El "valor" de un puntero es un puntero!
36. Otros constructores
• Los constructores de clases pueden tener argumentos arbitrarios, siempre que
sus firmas sean únicas y no ambiguas:
37. •Como el argumento no se modifica,
podemos declararlo como const.
Esto nos permitirá construir
instancias String a partir de matrices
char constantes.
38. Operadores de Asignación
• La asignación es diferente del constructor de copia porque ya existe una
instancia:
39. •Return String& rather than void so the result
can be used in an expression
•Return String& rather than String so the
result won’t be copied!
•this is a pseudo-variable whose value is a
pointer to the current object
•so *this is the value of the current object,
which is returned by reference
40. Conversión implícita
• Cuando un argumento del tipo "incorrecto" se pasa a una función, el compilador
de C ++ busca un constructor que lo convierta al tipo "correcto":
42. Sobrecarga del operador (indexación)
• No solo la asignación, sino que otros operadores útiles pueden "sobrecargarse"
siempre que sus firmas sean únicas:
45. • Pero:
• No puede ser una función miembro de ostream, ya que no podemos extender la
biblioteca estándar.
• No puede ser una función miembro de String ya que el objetivo es cout.
• Pero debe tener acceso a los datos privados de String
46. •So ... we need a binary function << that takes
a cout and a String as arguments, and is a
friend of String.
49. Mapa vial
• C++ vs C
• C++ vs Java
• References vs pointers
• C++ classes: Orthodox Canonical Form
• A quick look at STL — The Standard Template Library
50. Biblioteca de plantillas estándar
• STL es una biblioteca C ++ de propósito general de algoritmos genéricos y estructuras de datos.
• Los contenedores almacenan colecciones de objetos
• vector, list, deque, set, multiset, map, multimap
• Iteradores atraviesan contenedores
• acceso aleatorio, bidireccional, hacia adelante / hacia atrás ...
• Los objetos de función encapsulan funciones como objetos
• aritmética, comparación, lógica y definida por el usuario ...
• Algoritmos implementan procedimientos genéricos
• buscar, contar, copiar, random_shuffle, ordenar, ...
• Los adaptadores proporcionan una interfaz alternativa a un componente
• stack, queue, reverse_iterator
51. Un inversor de línea STL
• #include <iostream>
• #include <stack> // STL stacks
• #include <string> // Standard
strings
• void rev(void)
• {
• typedef stack<string> IOStack; // instantiate the template
• IOStack ioStack; // instantiate the template class
• string buf;
• while (getline(cin, buf)) {
• ioStack.push(buf);
• }
52. • IOStack ioStack; //
instantiate the template class
• string buf;
• while (getline(cin, buf)) {
• ioStack.push(buf);
• }
•
54. ¡Lo que deberías saber!
• ¿Qué nuevas características agrega C ++ a C?
• ¿Qué elimina Java de C ++?
• ¿Cómo debería usar los estilos de comentarios C y C ++?
• ¿Cómo se diferencia una referencia de un puntero?
55. • ¿Cuándo debería usar punteros en C ++?
• ¿Dónde viven los objetos C ++ en la memoria?
• ¿Qué es una lista de inicialización de miembros?
• ¿Por qué C ++ necesita destructores?
• ¿Qué es OCF y por qué es importante?
• ¿Cuál es la diferencia entre eliminar y eliminar []?
• ¿Qué es la sobrecarga del operador?
56. ¿Puedes responder estas preguntas?
• ¿Por qué C ++ no admite la recolección de basura?
• ¿Por qué Java no es compatible con herencia múltiple?
• ¿Qué problema puedes tener con las referencias?
57. • ¿Por qué C ++ no hace copias profundas por defecto?
• ¿Cómo se puede declarar una clase sin un constructor predeterminado?
• ¿Por qué los objetos de la misma clase pueden acceder a miembros privados de
los demás?
58.
59. • MyClass& start() { // returns a reference
• MyClass a("a"); // automatic
• MyClass *b = new MyClass("b"); // dynamic
• return *b; //
returns a reference (!) to b
• }
// a goes out of scope
• void finish(MyClass& b) {
• delete &b;
// need pointer to b
• }
60. • include "MyClass.h”using namespace std;int main (int argc, char **argv) {
MyClass aClass("d");
• finish(start()); return 0;
• }