¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. C++
  3. Introducción a C++
Extrait - C++ De los fundamentos del lenguaje a las aplicaciones (2ª edición)
Extractos del libro
C++ De los fundamentos del lenguaje a las aplicaciones (2ª edición) Volver a la página de compra del libro

Introducción a C++

Conceptos clave

1. Principales características del lenguaje C++

El lenguaje C++ hizo su debut oficial en 1983, cuando se utilizó por primera vez fuera del laboratorio de AT&T, donde fue creado. Su diseñador, Bjarne Stroustrup, había comenzado su trabajo varios años antes, probablemente hacia 1980. El lenguaje C++ -conocido hasta entonces como «C con clases»- se desarrolló conservando la mayoría de los conceptos de su predecesor, el lenguaje C. A continuación, ambos lenguajes intercambiaron conceptos.

Al igual que el lenguaje C, C++ adopta un enfoque muy orientado a la máquina. Originalmente estaba pensado para escribir sistemas operativos, pero sus características han abierto otras posibilidades.

El lenguaje se compone de instrucciones muy explícitas y cortas, cuyo tiempo de ejecución se puede planificar de antemano en el momento de escribir el programa.

Como el número de instrucciones y notaciones está deliberadamente limitado, existen muchas interpretaciones posibles de las construcciones semánticas y esto es, sin duda, a lo que el diseñador del lenguaje C++ se refiere como expresividad. 

Sin embargo, Bjarne Stroustrup procuró evitar algunos de los escollos del lenguaje C, en particular, su tendencia a reducirlo todo al nivel del byte, una cantidad numérica limitada y totalmente obsoleta en la historia de la informática, incluso en 1980. Para lograr este objetivo, el lenguaje se enriqueció con clases que describen tipos de datos adaptados a las distintas necesidades del programador. La visibilidad del lenguaje, combinada con la abstracción de las clases, proporciona programas de alto nivel.

Las clases (y la programación orientada a objetos) no se inventaron con C++. El inventor del lenguaje se esforzó por adaptar conceptos de alto nivel introducidos por el lenguaje Simula en 1967 a una plataforma muy explícita, el lenguaje C.

El resultado es un lenguaje muy rico, muy potente, especialmente expresivo y, al mismo tiempo, muy eficaz. A continuación, el lenguaje se perfeccionó, evolucionó y transformó hasta que el producto de laboratorio se convirtió en una norma, certificada por el organismo estadounidense ANSI (American National Standards Institute). Los trabajos de normalización comenzaron en 1987 y finalizaron en...

Los primeros programas

Ahora vamos a averiguar cómo se puede utilizar C++ para implementar algoritmos. C++ pertenece a la familia de los lenguajes procedimentales, lo que significa que las instrucciones de un programa se agrupan para formar procedimientos, también conocidos como funciones.

Un programa C++ utiliza, por un lado variables para almacenar valores y, por otra parte, instrucciones para cambiar estos valores. Éste no es el aspecto más original de C++, ya que comparte esta base «algorítmica» con el lenguaje C. Como resultado, muchos tipos de datos son comunes a ambos lenguajes, y las instrucciones básicas también son idénticas. Esto hace que C++ sea más fácil de aprender y mejora la portabilidad hacia arriba.

También hay que señalar que la sintaxis de C++ es un poco más flexible que la de C, sobre todo en lo que se refiere a la declaración de variables y argumentos. Esto mejora naturalmente la corrección de los programas.

Para los lectores que se inician en la programación orientada a objetos con C++, es esencial asimilar plenamente la programación funcional, es decir, la programación basada en funciones. Conocer los algoritmos básicos -búsquedas, ordenaciones- es una muy buena manera de conseguirlo. La programación orientada a objetos es un superconjunto de la programación funcional, una forma particular de estructurarla y explotarla. Pero las reglas básicas siguen siendo las mismas.

1. Los comentarios

Antes de empezar con las instrucciones y las declaraciones de variables, vamos a explicar la notación para los comentarios.

Los comentarios son anotaciones escritas por el programador. Facilitan la relectura y a veces recuerdan la función de determinadas variables o bloques de instrucciones.

Existen dos tipos de comentarios en el lenguaje C++: comentarios de una sola línea y comentarios de varias líneas.

Para el primer tipo, se utiliza la barra invertida. El compilador que reconoce esta secuencia // ignora todo lo que sigue hasta el final de la línea.

El segundo tipo está delimitado por las secuencias /* y */, lo que permite realizar anotaciones en varias líneas o en sólo una parte de una línea, como en el lenguaje C. Atención: el uso de comentarios anidados /* ...... /* ... */ ......*/ no siempre...

Matrices

Las matrices, al igual que las variables, son una estructura muy importante para los algoritmos. Una matriz es un conjunto de valores de un tipo determinado. Se accede a cada valor dando a la matriz un número, llamado índice. En C++, los índices empiezan en 0 y aumentan hasta N-1, donde N es el tamaño de la matriz, es decir, el número de elementos que contiene.

El tipo de la matriz -de hecho, el tipo de los elementos que contiene- es arbitrario: valor escalar, objeto, puntero, etc. He aquí dos ejemplos de matrices:

double coord[2];  // matriz de dos elementos coord[0] y coord[1] 
char* dico[10000]; /* matriz de 10000 punteros desde dico[0] 
hasta dico[9999] */ 

También es posible definir matrices multidimensionales:

double matriz[3][3];  // un matriz, de 2 dimensiones 

Para inicializar una matriz podemos acceder a cada uno de sus elementos:

coord[0]=10; 
coord[1]=15; 

También es posible inicializar la matriz por extensión, es decir, suministrando sus valores en el momento de la declaración:

char separadores[] = { ' ','*','-' }; 

Los literales de cadena son muy útiles para inicializar matrices de caracteres. Lo siguiente:

char cadena[]="Hola"; 

es más sencillo de usar que:

char cadena[]={'H','o','l','a'}; 

He aquí un ejemplo de búsqueda del valor...

Funciones y prototipos

Para entender bien la programación orientada a objetos, hay que conocer bien la programación funcional. Una función es un conjunto de instrucciones -y a veces también de variables locales- a las que se ha dado un nombre. Esta función acepta argumentos y generalmente evalúa un valor de retorno.

Por tanto, una función se modela mediante una caja con entradas y una salida:

images/cap1_pag69.png

La firma de la función define su nombre, argumentos de entrada y salida:

int suma(int a,int b) 

Esta secuencia especifica que la función sum() recibe dos argumentos de tipo entero a y b (entrada) y devuelve un entero. Por el momento, no importa cómo se ejecuta la función, es decir, cómo se determina la suma.

1. Declaración de una función

En C++, una función se debe declarar antes de poder utilizarse. Hay dos formas de hacerlo: la definición completa y el prototipo. La definición completa comienza con la firma y continúa con la lista de instrucciones entre dos llaves:

int suma(int a,int b) 
{ 
  return a+b; 
} 

En el enfoque por prototipo, terminamos la declaración con un punto y coma.

int suma(int a,int b) ; 

La firma y el cuerpo de la función (es decir, la definición completa) se pueden incluir en otro archivo fuente con la extensión .cpp. El compilador no los necesita para compilar, porque el prototipo ya le indica la lista de argumentos y el tipo de retorno. Cuando se editan los enlaces, «todas las piezas se vuelven a juntar».

Es frecuente agrupar todos los prototipos en un archivo de cabecera .h, y proporcionar la implementación en un archivo .cpp o en forma de librería estática .lib.

2. Funciones y procedimientos

Se utiliza la misma sintaxis para describir estos dos elementos, mientras que lenguajes como Basic (Function/Sub) o Pascal (Function/Procedure) distinguen entre ellos. En C++, al igual que en C, se utiliza el tipo de retorno void, término tomado del inglés y que significa vacío, vacante. Este tipo indica que una función no devuelve nada (en el caso de un procedimiento) o que aún no tenemos información sobre el tipo finalmente utilizado (en el caso de los punteros void*).

El cuerpo de una función contiene una serie de sentencias return que detienen su ejecución...