Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructura C++
Estructura C++
Estructura C++
Apéndice II
Guía de sintaxis del lenguaje
ANSI/ISO C++ estándar
v1*
EL LENGUAJE DE PROGRAMACIÓN C++
C++ es considerado un C más grande y potente. La sintaxis de C++ es una extensión de C, al que se han
añadido numerosas propiedades, fundamentalmente orientadas a objetos. C ANSI 1 ya adoptó numerosas
características de C++, por lo que la emigración de C a C++ no suele ser difícil.
En este apéndice se muestran las reglas de sintaxis del estándar clásico de C++ recogidas en el Annotated
Reference Manual (ARM), de Stroustrup & Ellis, así como las últimas propuestas incorporadas al nuevo
borrador de C++ ANSI, que se incluyen en las versiones actuales de AT&T C++.
El sistema operativo utiliza el valor devuelto por main() para determinar si el programa ha tenido o
no éxito. Un valor de retorno 0 indica éxito. La función main() debe existir en cada programa C++ y
es la única función que llama explícitamente el sistema operativo.
Un programa C++ completo que visualice la frase en español "Hola mundo"es
// programa hola.cpp
// el programa visualiza "Hola mundo"
#include <iostream> // declaraciones
using namespace std;
int main() // función main( )
{
// visualizar "Hola mundo"
cout<< "Hola mundo!" << endl;
return 0;
}
La directiva using namespace std define el espacio de nombres std y evita tener que utilizar esta
directiva. Si no se utiliza el espacio de nombres using namespace std la salida con cout requerirá
ser precedida por el espacio de nombre std.
* Fuente: Programación en C/C++, Java y UML, 2ª ed. Joyanes-Zahonero, 2014 (páginas 596-737)
2
Símbolo Significado
std::cin canal de entrada estándar (teclado)
std::cout canal de salida estándar (pantalla)
std::cerr canal de salida de error (pantalla)
std::endl símbolo para avance de línea
endl es una instrucción especial de C++ que significa “comienzo de nueva línea”. La inserción
de endl en el flujo de salida hace que el cursor de la pantalla se mueva al principio de la siguiente
línea. Por ejemplo, cout << " Hola!! " << endl; otra forma de indicar nueva línea es con el
carácter '\n', por ejemplo, cout << " \n " equivale a cout << endl.
Ejemplo
Regla
cout << "Introducir dos números"; visualiza texto
cin >> n1 >> n2; entrada de dos datos
Archivos de cabecera
La directiva #include indica que se desea utilizar la biblioteca iostream y que se debe añadir el
archivo fuente iostream al archivo fuente del programa antes de comenzar la compilación.
Los archivos como iostream se denominan también archivos de inclusión (include) ya que se adjun-
tan en otros archivos o bien archivos de cabecera (header), ya que ellos se incluyen al principio de un
archivo. Los compiladores de C++ vienen con muchos archivos de cabecera que soportan un amplio
conjunto de propiedades y características.
Regla
La directiva #include se debe escribir en una sola línea; el nombre del archivo de cabecera e inclu-
de deben aparecer en la misma línea. En general, las directivas #include aparecerán fuera de cual-
quier función; normalmente, todas las directivas #include de un programa aparecen al principio del
archivo.
ESPACIOS DE NOMBRES
C++ estándar tiene la característica de espacios de nombre, que permite facilidades para nombrar a
variables, funciones, estructuras, clases, enumeraciones, etc. y que no se produzcan conflictos en
dichos nombres.
4
Regla 1
Si se usa el archivo <iostream> se necesita utilizar el espacio de nombre std para E/S
#include
<iostream> int
main ( )
{
std::cout<< "¡Hola mundo!" << std::endl;
return 0;
}
Sin embargo, es posible otro estilo de escritura que requiera el uso de std:: cuando se utiliza el archivo
iostream. Este estilo de escritura requiere el uso de la directiva using que permite disponer las
definiciones de iostream en sus programas. Si desea utilizar este método similar al estilo iostream.h
debe incluir en sus programas
#include <iostream>
using namespace std;
Ejemplo
include <iostream>
using namespace std;
int main ( )
{
cout<< "¡Hola mundo!" << endl;
}
.3 Tipos integrales.
Tipo Significado
int entero (tamaño de palabra típica de la máquina)
short valor más pequeño que el normal
long valor mayor que el normal
bool número lógico o boolean (verdadero/falso)
OPERADORES
C++ proporciona un conjunto muy rico de operadores y define cuáles de estos operadores se aplican
a tipos fundamentales. Una expresión se compone de uno o más operandos que se combinan mediante
operadores. La forma más simple de una expresión consta de una sola constante literal o variable. Las
expresiones más complejas se forman con un operador y uno o más operandos. Cada expresión
produce un resultado.
Existen operadores unitarios que actúan sobre un solo operando (operador dirección &; operador
de referencia *) y operadores binarios y terciarios, que actúan sobre dos o tres operandos (suma +,
resta –). Los operadores se clasifican en función de las tareas que ejecutan: aritméticos, relacionales,
lógicos, etc.
.9 Operadores de asignación.
Operador Significado
= Asignación simple
*=
/=
%=
+= m operador = n ;
−= equivale a
<<= m = m operador n
>>=
&=
^=
Tabla
16.10 Operadores de incremento y decremento.
Operador Significado
++ Incremento posfijo (a++)
−−
Decremento posfijo (a−−)
++
Incremento prefijo (++a)
−−
Decremento prefijo (−−a)
ESTRUCTURAS DE CONTROL
Las sentencias de control de un lenguaje de programación determinan el flujo de ejecución a través
de un programa. Existen tres categorías: Secuencia, Selección y Repetición.
8
Selección y repetición
Las sentencias o estructuras de control no secuenciales se clasifican en sentencias de selección (if-else
y switch) y sentencias de repetición (iterativas o bucles, for, while y do_while).
Las sentencias for, while y do_while implementan la realización de bucles (lazos, loop)
que contienen sentencias que se ejecutan repetidamente.
Sentencia if
Una sentencia if se utiliza para comprobar una condición determinada. La sentencia if tiene dos
for- matos: if e if-else
Sentencia Switch
La sentencia switch se utiliza para seleccionar entre múltiples valores constantes; por ejemplo, crear
un menú en la pantalla que solicite al usuario seleccionar una de cinco elecciones posibles (‘Almorzar’,
‘Desayunar’, ‘Cenar’, ‘Aperitivo’ y ‘Merienda’). La sintaxis de switch es:
switch (expresión entera o selector)
{
case etiqueta1: sentencia(s);
break;
case etiqueta2: sentencia(s);
break;
…
default: sentencias;
}
Aplicación de switch
switch (operador)
{
case '+': resultado = m + n;
9
suma ++;
break;
case '-': resultado = m – n;
diferencia --;
break;
case '*': resultado = m * n;
producto --;
break;
case '/': resultado = m / n;
cociente --;
break;
default: cout << "respuesta no válida";
}
Sentencia while
Uno de los conceptos más fundamentales en cualquier lenguaje de programación es el de bucle (lazo,
loop). Un bucle es un conjunto de sentencias (puede no tener sentencias, bucle vacío) que se
ejecutan repetidamente hasta que se cumple una determinada condición o bien se alcanza un número
fijo de iteraciones o repeticiones de todas las sentencias. while, do-while y for son las sentencias típicas
de realización de bucles.
El bucle while es un bucle pre-test (pre-condición) donde la condición que debe cumplirse
en el bucle para su continuación se comprueba antes de cada parada (iteración) del bucle.
Sentencia do-while
El bucle do-while es un bucle post-test (post-condición). La condición del bucle se comprueba
después de cada ejecución. Como resultado el bucle do-while se ejecuta al menos una vez.
do do {
sentencia
sentencia
s
while
Sentencia for
Un bucle for es una sentencia iterativa que normalmente se utiliza con una variable que se
incrementa o decrementa
Sintaxis
10
FUNCIONES
Una función es un grupo de sentencias que realizan una operación o tarea específica. En la resolución
de problemas tanto por métodos estructurados como por métodos orientados a objetos, se recurre a un
proceso de refinamiento sucesivo que implica la descomposición de un problema o proceso, en subpro-
blemas o subprocesos más pequeños y de menor complejidad.
Las funciones se utilizan para capturar y representar los procesos y subprocesos. El programa
principal (main) de C++ es una secuencia de llamadas a funciones que pueden llamar a otras
funciones.
C++ proporciona mecanismos para crear funciones definidas por el usuario, así como
proporcionar una biblioteca estándar de funciones, como la biblioteca estándar stdio.h de ANSI C,
y las específicas de C++, como biblioteca de flujos, stream, iostream, etc.
Funciones de biblioteca
La función sqrt( ) devuelve la raíz cuadrada de un número y pertenece a la biblioteca estándar de
funciones de C/C++. Para poder utilizar una función de biblioteca se debe incluir el archivo de cabecera
cmath (math.h en los compiladores antiguos que siguen ANSI C o los primeros compiladores de
C++). Una vez incluido el archivo de cabecera correspondiente a la biblioteca, se necesita proporcionar
11
el prototipo. Cada función de la biblioteca C++ tiene un prototipo en uno o más archivos de cabecera.
No se debe confundir el prototipo de la función con la definición de la función. El prototipo solo
describe la interfaz de la función.
double sqrt (double);
es decir, describe la información enviada a la función y la información enviada de retorno. La
definición, sin embargo, incluye el código que calcula la raíz cuadrada de un número. C++ separa estas
dos características, prototipo y definición, de las funciones de biblioteca. Los archivos de biblioteca
contienen el código compilado de las funciones mientras que los archivos de cabecera contienen
prototipos.
La práctica usual es situar los prototipos antes de la definición de la función main(); de modo
similar a:
#include <iostream>
#include <cmath> // o bien math.h, en sistemas antiguos
Una vez incluida la directiva correspondiente; ya se puede utilizar sqrt( ). Por ejemplo, la sentencia
x = sqrt(27.04) // devuelve el valor 5.2 y lo
// asigna a x
La sintaxis a emplear es la siguiente: sqrt (27.04) invoca o llama a la función sqrt( ). La expre-
sión sqrt(27.04) se denomina llamada a la función, la función invocada se denomina función llamada
y la función que contiene la llamada de la función se denomina función llamadora.
Para poder utilizar una función se debe especificar su prototipo. Para que el compilador pueda com-
pilar una llamada a una función primero debe conocer la declaración de esa función. Las declaraciones
de las funciones normalmente aparecen antes de la función main( ) en un programa, pero también
se pueden situar en archivos de inclusión.
Para llamar a una función se utiliza el operador de llamada que es el nombre de la función con una
lista de argumentos, solo los nombres.
// obtener dos valores para
deducir su mcd cout <<
"Introducir dos números:
\n";
int m, n;
cin >> m >> n;
// obtener el mcd
cout << "mcd: " << mcd(m,n) << endl;
Regla
Sintaxis del prototipo de una función: Tipo nombre (lista de argumentos);
return n*n*n;
}
Ejemplo: Función típica de intercambio de los valores de dos variables utilizada en algoritmos de
ordenación:
void intercambio (int &m, int &n)
{
int aux = m;
m = n;
n = aux;
}
Sentencia return
La sentencia return termina la función que se está ejecutando actualmente y devuelve el control a
la función que la llamó. Existen dos formatos de la sentencia return.
return;
return expresión;
Una sentencia return sin ningún valor, solo se puede utilizar en una función que tiene un tipo
de retorno void. Las funciones que devuelven void no requieren contener una sentencia return,
aunque cuando una función utiliza return es para producir una terminación prematura de la función.
El segundo formato de la sentencia return proporciona el resultado de la función. Cada retorno
de una función con un tipo distinto de void debe devolver un valor. El valor devuelto debe tener el
mismo tipo que el tipo de retorno de la función, o debe tener un tipo que pueda ser convertido
implícitamente a este tipo.
Ejemplo: Calcular el importe total de un conjunto de artículos de un supermercado, cada precio ha
de ser incrementado con las tasas de impuestos (IVA).
double precio_total (int numero, double precio)
{
const double IVA =
0.16; // 16% de impuesto double subtotal;
subtotal = precio * numero;
return (subtotal + subtotal * IVA);
}
Directiva #include
El formato
#include <cabecera>
CLASES Y OBJETOS
Las clases son un nuevo tipo de dato cuyas variables serán objetos. Una clase es un tipo de dato que
contiene código (funciones) y datos y permite encapsular todo el código y los datos necesarios para
gestionar un tipo específico de un elemento de programa, como una ventana en la pantalla, un
dispositivo conectado a una computadora, una figura de un programa de dibujo o una tarea realizada por
una computadora.
Una clase es un medio para traducir la abstracción de un tipo definido por el usuario. Combina la
representación de los datos miembros (atributos) y las funciones miembro (métodos) que manipulan
esos datos en una única entidad o paquete que se trata como tal. La colocación de datos y funciones
juntas en una sola entidad (clase) es una idea central en programación orientada a objetos.
15
Sintaxis
Regla práctica
• Los atributos (datos) son variables simples (de tipo entero, estructuras, arrays, float, etc.).
• Los métodos (funciones) son funciones simples que actúan sobre los atributos (datos).
• La omisión del punto y coma detrás de la llave de cierre es un error frecuente, difícil de detectar.
Sección Comentario
};
Datos o
Accesible desde el exterior de la clase
En la clase Semaforo se observa que la sección pública declara la definición de los servicios (acción
de cambio de color del semáforo) y en la sección privada, en último lugar, los detalles internos del
semáforo (diferentes tipos de colores del semáforo).
CONSTRUCTORES
Un constructor es una función miembro de propósito específico que se ejecuta automáticamente
cuando se crea un objeto de una clase. Un constructor sirve para inicializar los miembros dato de una
clase.
Un constructor tiene el mismo nombre que la propia clase. Cuando se define un constructor no
se puede especificar un valor de retorno, ni incluso void (un constructor nunca devuelve un valor).
Un constructor puede, sin embargo, tomar cualquier número de parámetros (cero o más).
• El constructor tiene el mismo nombre que la clase.
• Puede tener cero, o más parámetros.
• No devuelve ningún valor
La clase Rectangulo tiene un constructor con cuatro parámetros
class Rectangulo
{
private:
int izdo;
int superior;
int dcha;
int inferior;
// constructor
Rectangulo (int i, int s, int d, int inf);
// definiciones de otras funciones miembro
};
18
Cuando se define un objeto se pasan los valores de los parámetros al constructor utilizando una sintaxis
similar a una llamada normal de la función:
Rectangulo Rect (25, 25, 75, 85);
Esta definición crea una instancia del objeto Rectangulo e invoca al constructor de la clase pasando
los parámetros con valores especificados.
DESTRUCTORES
En una clase se puede definir también una función miembro especial conocida como destructor, que
se llama automáticamente siempre que se destruye un objeto de la clase. El nombre del destructor es
el mismo que el nombre de la clase, precedida con el carácter ~. Al igual que un constructor, un
destructor se debe definir sin ningún tipo de retorno (ni incluso void); al contrario que un constructor,
no puede aceptar parámetros. Solo puede existir un destructor.
class Demo
{
private:
int datos;
public:
~Demo( ){datos = 0;} // constructor
~Demo ( ) { } // destructor
};
Los destructores no tienen valor de retorno y tampoco tienen argumentos. El uso más frecuente de un
destructor es liberar memoria que fue asignada por el constructor. Si un destructor no se declara
explícitamente, C++ crea uno vacío de manera automática.
HERENCIA
La herencia es la propiedad que permite definir nuevas clases usando como base clases ya existentes.
La nueva clase (clase derivada) hereda los atributos y comporta- miento que son específicos de ella.
La herencia es una herramienta poderosa que proporciona un marco adecuado para producir software
fiable, comprensible, de bajo costo, adaptable y reutilizable.
La herencia o relación es-un es la relación que existe entre dos clases, en la que una clase denominada
derivada se crea a partir de otra ya existente, denominada clase base. Este concepto nace de la
necesidad de construir una nueva clase y existe una clase que representa un concepto más general; en
este caso la nueva clase puede heredar de la clase ya existente. Así por ejemplo, si existe una clase
Figura y se desea crear una clase Triángulo, esta clase Triángulo puede derivarse de Figura ya
que tendrá en común con ella un estado y un comportamiento, aunque luego tendrá sus características
propias. Triángulo es-un tipo de Figura. Otro ejemplo puede ser Programador, que es-un tipo de
Empleado.
La declaración de derivación de clases debe incluir el nombre de la clase base de la que se deriva y el
especificador de acceso que indica el tipo de herencia (pública, privada y protegida). La primera línea
de cada declaración debe incluir el formato siguiente:
class nombre _clase : tipo_herencia nombre_clase_base
19
• Especificador de acceso public significa que los miembros públicos de la clase base son
miembros públicos de la clase derivada.
• Herencia pública es aquella en que el especificador de acceso es public (público).
• Herencia privada es aquella en que el especificador de acceso es private (privado).
• Herencia protegida es aquella en que el especificador de acceso es protected (protegido).
El especificador de acceso que declara el tipo de herencia es opcional (public, private o protec-
ted); si se omite el especificador de acceso, se considera por defecto private. La clase base
(ClaseBase) es el nombre de la clase de la que se deriva la nueva clase. La lista de miembros consta de
datos y funciones miembro:
class nombre_clase : especificador_acceso opcional ClaseBase {
lista_de_miembros;
};
Tipos de herencia
En una clase existen secciones públicas, privadas y protegidas. Los elementos públicos son accesibles
a todas las funciones; los elementos privados son accesibles solo a los miembros de la clase en que
están definidos; se puede acceder a los elementos protegidos por clases derivadas debido a la propiedad
de la herencia. En correspondencia con lo anterior, existen tres tipos de herencia: pública, privada y
protegida. Normalmente, el tipo de herencia más utilizada es la herencia pública que es
20
predeterminada.
Si accidentalmente se olvida la palabra reservada public, los elementos de la clase base serán
inaccesibles. El tipo de herencia es, por consiguiente, una de las primeras cosas que se debe verificar,
si un compilador devuelve un mensaje de error que indique que las variables o funciones son
inaccesibles.
Herencia pública
En general, herencia pública significa que una clase derivada tiene acceso a los elementos públicos
y protegidos de su clase base. Los elementos públicos se heredan como elementos públicos; los
elementos protegidos permanecen protegidos.
class ClaseDerivada : public ClaseBase {
public:
//sección pública
private:
//sección privada
};
Herencia privada
La herencia privada significa que un usuario de la clase derivada no tiene acceso a ninguno de sus
ele- mentos de la clase base. El formato es:
class ClaseDerivada : private ClaseBase {
public:
// sección pública
protected:
// sección protegida
private:
// sección privada
};
Con herencia privada, los miembros públicos y protegidos de la clase base se vuelven miembros pri-
vados de la clase derivada. En efecto, los usuarios de la clase derivada no tienen acceso a las facilidades
proporcionadas por la clase base. Los miembros privados de la clase base son inaccesibles a las
funciones miembro de la clase derivada.
Herencia protegida
Con herencia protegida, los miembros públicos y protegidos de la clase base se convierten en miembros
protegidos de la clase derivada y los miembros privados de la clase base se vuelven inaccesibles. La
herencia protegida es apropiada cuando las facilidades o aptitudes de la clase base son útiles en la
implementación de la clase derivada, pero no son parte de la interfaz que el usuario de la clase utiliza.
La herencia protegida es todavía menos frecuente que la herencia privada.
Declarar una clase base (Base) y tres clases derivadas de ella D1, D2, D3
class Base {
public:
int i1;
protected:
int i2;
private:
int i3;
};
class D1 : private Base {
void f( );
};
class D2 : protected Base {
void g( );
};
class D3: public Base {
void h( );
21
};
Herencia múltiple
Herencia múltiple es un tipo de herencia en la que una clase hereda el estado
(estructura) y el comporta- miento de más de una clase base. En otras palabras,
hay herencia múltiple cuando una clase hereda de más de una clase; es decir,
existen múltiples clases base (ascendientes o padres) para la clase derivada
(descendiente o hija).
class Estudiante {
...
};
class Trabajador {
...
};
class Estudiante_Trabajador : public Estudiante, public Trabajador {
…
};
POLIMORFISMO
En POO, el polimorfismo permite que diferentes objetos respondan de modo distinto al mismo
mensaje; adquiere su máxima potencia cuando se utiliza en unión de herencia. Por ejemplo, si
figura es una clase base de la que cada figura geométrica hereda características comunes,
C++ permite que cada clase utilice una función (método) Copiar como nombre de una fun-
ción miembro
class figura {
tipoenum tenum; // tipoenum es un tipo enumerado
public:
virtual void Copiar( );
virtual void Dibujar( );
virtual double Area( );
};