Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guía de Sintaxis Ansi/Iso Estándar C++: Apéndiceb
Guía de Sintaxis Ansi/Iso Estándar C++: Apéndiceb
CONTENIDO
yado y pueden tener uno o ms caracteres. Los caracteres segundo y poste- TABLA B.2. Palabras reservadas de Borland C++ 5
riores pueden ser letras, dgitos o un subrayado, no permitindose caracte- _ _asm _ _cdecl _ _cs _ _declspec _ _ds
res no alfanumricos ni espacios. _ _es _ _except _ _export _ _far _ _fastcall
test_prueba //legal _ _finally _ _huge _ _import _ _interrupt _ _loadds
X123 //legal _ _near _ _pascal _ _rtti _ _saveregs _ _seg
multi_palabra //legal _ _ss _ _stdcall _ _thread _ _try _ asm
var25 //legal _cdecl _cs _ds _es _export
15var //no legal _far _fastcall _huge _import _interrupt
_loadds _near _pascal _saveregs _seg
C++ es sensible a las maysculas. Las letras maysculas y minsculas se _ss _stdcall asm auto bool
consideran diferentes. break case catch cdecl char
class const const_cast continue default
Paga_mes es un identificador distinto a paga_mes delete do double dynamic_cast else
enum explicit extern false far
Buena prctica de programacin aconseja utilizar identificadores sig- float for friend goto huge
nificativos que ayudan a documentar un programa. if inline int interrupt long
mutable namespace near new operator
nombre apellidos salario precio_neto pascal private protected public register
Edad Longitud Altura Salario_Mes reinterpret_ cast return short signed sizeof
static static_cast struct switch template
this throw true try typedef
B.1.4. Palabras reservadas typeid typename union unsigned using
virtual void volatile wchar_ t while
Las palabras reservadas o claves no se pueden utilizar como identificadores,
debido a su significado estricto en C++; tampoco se pueden redefinir. La
Tabla B.1 enumera las palabras reservadas de C++ segn el ARM2. TABLA B.3. Palabras reservadas de Visual C++ 6
_asm _fastcall public signed
TABLA B.1. Palabras reservadas (Keywords) de ANSI/ISO C++ _except new unsigned void
_virtual_inheritance typedef using directive do
asm* default for new* sizeof typedef throw class default _leave
auto delete* friend* operator* static typename case goto _int8 struct
bool* do goto private* struct union _finally register sizeof auto
break double if protected* switch unsigned operator using declaration volatile explicit
case else inline* public* template* using typeid uuid double mutable
catch* enum int register this* virtual* const delete long true
char explicit* long return throw* void if _intl6 switch catch
class* extern mutable* short true* volatile* reinterpret_cast static template flota
const false* namespace* signed try* while return wmain _based private
continue float _uuidof dynamic-cast extern typename
dl1export man naked const-cast
* Estas palabras no existen en C ANSI. _int32 _multiple try inline
_inheritance
static-cast this _cdecl _inline
Los diferentes compiladores comerciales de C++ pueden incluir, while bool for short
adems, nuevas palabras reservadas. Estos son los casos de Borland, Micro- else false protected virtual
soft y Symantec. enum namespace union dllimport
-single-inheritance _try continue _int64
2 Siglas del libro de Margaret Ellis y Bjarne Stroustrup en el que se definen las reglas de thread char _dec1spec _stdcall
break friend int xalloc
sintaxis del lenguaje C++ estndar, Annotated Reference Manual, Addlson-Wesley, 1992.
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 565
El comit ANSI ha aadido nuevas palabras reservadas (Tabla B.4). Fallo al devolver un valor de una funcin. Una funcin en C + +
declarada con un tipo determinado de retorno ha de devolver un valor
TABLA B.4. Nuevas palabras reservadas de ANSI C++ de ese tipo. En C est permitido no seguir la regla.
bool false reinterpret_cast typeid
Asignacin de punteros void. La asignacin de un tipo void* a un
cons_cast mutable static_cast using puntero de otro tipo se debe hacer con una conversin explcita en C
dynamic_cast namespace true wchar_t + +. En C se realiza implcitamente.
Inicializacin de constantes de cadena. En C++ se debe proporcionar un
espacio para el carcter de terminacin nulo cuando se inicializan cons-
B.2. Tipos de datos tantes de cadena. En C se permite la ausencia de ese carcter.
int main()
Los tipos de datos en C++ se dividen en dos grandes grupos: integrales {
(datos enteros) y de coma flotante (datos reales). La Tabla B.5 muestra los //...
char car[7] = Cazorla; //legal en C
diferentes tipos de datos en C++ //error en C++
//...
TABLA B.5. Tipos de datos simples en C++ return 0;
}
char signed char unsigned char
short int long Una solucin al problema que funciona tanto en C como en C++ es:
unsigned short unsigned unsigned long
char car[8] = Cazorla;
float double long double
double j;
B.4. CONVERSIN DE TIPOS for (j = 1.7547; j < 25.4675; j+= .001)
cout << i << endl;
Las conversiones explcitas se fuerzan mediante moldes (casts). La con- }
versin forzosa de tipos de C tiene el formato clsico:
(tipo) expresin
El programa anterior se podra rescribir, haciendo la declaracin y la
definicin dentro del mismo bucle:
C++ ha modificado la notacin anterior por una notacin funcional
como alternativa sintctica: int main()
{
nombre del tipo (expresin) for (int i=0; i<100; ++i)
cout << i << endl;
Las notaciones siguientes son equivalentes:
for (double j - 1.7545; j<25.4675;j += .001)
z = float(x); //notacin de moldes en C++ cout << i << endl;
z = (float)x; //notacin de moldes en C }
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 567
c=10;
Ejemplos a=b+c;
TABLA B.7. Operadores aritmticos de asignacin El operador ?: se conoce como expresin condicional. La expresin
condicional es una abreviatura de la sentencia condicional if_else. La sen-
Operador Formato largo Formato corto tenca if.
+= x = x + y; x + =y;
if (condicin)
-= x = x - y; x - =y;
variable = expresinl;
*= x = x * y; x * =y;
else
/= x = x / y; x / =y; variable = expresin2;
%= x = x%y; x % =y;
es equivalente a
Ejemplos
variable =(condicin) ? expresin1 : expresin2;
a += b; equivale a a = a + b;
a *= a + b; equivale a a = a * (a+b); La expresin condicional comprueba la condicin. Si esa condicin es
v += e; equivale a v = v + e; verdadera, se asigna expresin1 a variable; en caso contrario se asigna
v -=e; equivale a v = v%e; expresin2 a variable.
Expresiones equivalentes:
Reglas prcticas
n = n+1;
n += 1; Los operadores lgicos y relacionales actan sobre valores lgicos: el valor
n++; falso puede ser o bien 0, o bien el puntero nulo, o bien 0.0; el valor verda-
++n; dero puede ser cualquier valor distinto de cero. La siguiente tabla muestra
los resultados de diferentes expresiones.
::.->[]()++-- Izquierda-Derecha 1
TABLA B.10. Operadores de asignacin de manipulacin de bits ++ -- & (direccin) tipo) ! - ++ sizeof (tipo) Derecha-Izquierda 2
new delete* (indireccin)
Operador Formato largo Formato reducido
.* ->* Izquierda-Derecha 3
&= x = x & y; x & = y;
|= x = x | y; x | = y; * / % Izquierda-Derecha 4
= x = x ^ y; x = y;
<<= x = x << y; x << = y; + - Izquierda-Derecha 5
>>= x = x >> y; x >> = y;
<< >> Izquierda-Derecha 6
#include <iostream.h>
La mayora de los operadores de C++ pueden ser sobrecargados o redefini-
int main()
dos para trabajar con nuevos tipos de datos. La Tabla B.12 lista los opera- {
dores que pueden ser sobrecargados. cout << hola, mundo\n;
}
TABLA B.12. Operadores que se pueden sobrecargar Las salidas en C++ se pueden conectar en cascada, con una facilidad de
escritura mayor que en C.
+ - * / % & |
! = < > += -= *= #include <iostream.h>
/= %= = &= |= << >> >>= int main()
<<= == != <= >= && || ++ {
-- , - >* -> () [] int i;
i = 1099;
cout << El valor de i es << i << \n;
}
B.7.1. Salida
El flujo cout es el flujo de salida estndar que corresponde a stdout en
B.7.2. Entrada
C. Este flujo se deriva de la clase ostream construida en iostream.
La entrada se maneja por la clase istream. Existe un objeto predefinido is-
tream, llamado cin, que se refiere al dispositivo de entrada estndar (el
teclado). El operador que se utiliza para obtener un valor del teclado es el
operador de extraccin >>. Por ejemplo, si i era un objeto int, se escribir
Unidad cout Pantalla
central
entrada binaria salida de caracteres cin >> i;
FIGURA B.1. Uso de flujos para salida de caracteres. que obtiene un nmero del teclado y lo almacena en la variable i.
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 571
Un programa simple que lee un dato entero y lo visualiza en pantalla es: #include <iostream.h>
int main()
#include <iostream.h> {
int main() int i = 36;
{ cout << dec << i << oct << i << << hex << i << endl;
int i; }
cin >> i;
cout << i << \n;
} B.8. SENTENCIAS
Al igual que en el caso de cout, se pueden introducir datos en cascada: Un programa en C++ consta de una secuencia de sentencias. Existen diver-
sos tipos de sentencias. El punto y coma se utiliza como elemento terminal
#include <iostream.h> de cada sentencia.
int main()
{
char c[60]; B.8.1. Sentencias de declaracin
int x,y;
Se utilizan para establecer la existencia y, opcionalmente, los valores ini-
cin >> c >> x >> y; ciales de objetos identificados por nombre.
cout << c << << x << z<< y << \n;
} NombreTipo identificador, ...;
NombreTipo identificador = expresin, ...;
const NombreTipo identificador = expresin, ...;
Un mtodo fcil de cambiar la anchura del flujo y otras variables de forma- char c1;
to es utilizar un operador especial denominado manipulador. Un manipula- int p, q = 5, r = a+b; //suponiendo que a y b han sido
dor acepta una referencia de flujo como un argumento y devuelve una refe- //declaradas e inicializadas antes
rencia al mismo flujo.
const double IVA = 16.0;
El siguiente programa muestra el uso de manipuladores especficamen-
te para conversiones de nmero (dec, oct, y hex):
Las sentencias encerradas pueden ser cualquiera: declaraciones, expre- La frase Estoy en Sonora:Hermosillo, en agosto se visualiza
siones, sentencias compuestas, etc. Un ejemplo es: cuando temperatura es mayor o igual que 45. La sentencia siguiente se
ejecuta siempre.
{
int i = 5; La sentencia if_else tiene el formato siguiente:
double x = 3.14, y = -4.25;
int j = 4-i; 1. if (expresin) 2. if (expresin)"{
x = 4.5*(x-y); sentencia1; < secuencia de sentencias 1 >
} else else
sentencia2; < secuencia de sentencias 2 >
El cuerpo de una funcin C++ es siempre una sentencia compuesta.
Si expresin es distinto de cero, la sentencia1 se ejecuta y senten-
cia2 se salta; si expresin es cero, la sentencia1 se salta y sentencia2
B.9. SENTENCIAS CONDICIONALES: if se ejecuta. Una vez que se ha ejecutado la sentencia if_else, el control
pasa a la siguiente sentencia.
El formato general de una sentencia if es:
if (expresin) if (expresin) {
sentencia <secuencia de sentencias> Ejemplo 4
}
if (Numero == 0)
Si expresin es verdadera (distinta de cero), entonces se ejecuta sen- cout << No se calcular la media;
tencia o secuencia de sentencias; en caso contrario se salta la sentencia. else
media = total / Numero;
Despus que la sentencia if se ha ejecutado, el control pasa a la siguiente sen-
tencia.
Ejemplo 1 Ejemplo 5
else { break;
descuento = 0; case constante n:
precio = n * Precio; sentencias
} break;
default: //opcional
sentencias
}
B.9.1. Sentencias if _else anidadas
La sentencia switch requiere una expresin cuyo valor sea entero.
C++ permite anidar sentencias if_else para crear una sentencia de alternati- Este valor puede ser una constante, una variable, una llamada a funcin o
va mltiple: una expresin. El valor de constante ha de ser una constante. Al ejecutar
la sentencia se evala expresin, y si su valor coincide con una cons-
if (expresin 1) tante, se ejecutan las sentencias a continuacin de ella; en caso contrario se
sentencia 1; | {sentenca compuesta} ejecutan las sentencias a continuacin de default.
else if (expresin 2)
sentencia 2; | {sentencia compuesta} switch (Puntos)
else if (expresion N) {
case 10:
sentencia N; | {sentencia compuesta}
nota ='A';
[else
break;
sentencia N+1; | {sentenca compuesta}] case 9:
nota = 'B';
break;
Ejemplo case 7,8:
nota = 'C';
if (a > 100) break;
if (b <= 0) case 5,6:
SumaP = 1; nota = 'D';
else break;
SumaN = 1; default:
else nota = 'F';
}
Numero = 1;
La sentencia switch ofrece una forma de realizar decisiones de alternativas Los bucles sirven para realizar tareas repetitivas. En C++ existen tres dife-
mltiples. El formato de switch es: rentes tipos de sentencias repetitivas:
while.
switch(expresion) do.
{ for.
case constante 1:
sentencias
break;
case constante 2: B.10.1. Sentencia while
sentencias
. La sentencia while es un bucle condicional que se repite mientras la con-
. dicin es verdadera. El bucle while nunca puede iterar si la condicin
. comprobada es inicialmente falsa. La sintaxis de la sentencia while es:
574 PROGRAMACIN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS
while (expresin) do
sentencia; {
cout <<Entrar;
o bien, cin >> n;
suma += n;
while (expresin){ i++;
< secuencia de sentencias > } while (i <=100);
} cout << La media es << double(suma)/100.0;
int *ip; 0 1 2 3 4 5 6 7 8 9
double *dp;
Se pueden, sin embargo, realizar asignaciones entre contenidos, ya que Si nombre apunta al primer elemento del array, entonces nombre + 1
se realizara una conversin explcita de tipos. apunta al segundo elemento. El contenido de lo que se almacena en esa posi-
cin se obtiene por la expresin
*dp = *ip;
*(nombre+1)
Existe un puntero especial (nulo) que se suele utilizar con frecuencia en
programas C++. El puntero NULL tiene un valor cero, que lo diferencia de
todas las direcciones vlidas. El conocimiento nos permite comprobar si un Aunque las funciones no pueden modificar sus argumentos, si un array
puntero p es el puntero NULL evaluando la expresin (p==0). Los punteros se utiliza como un argumento de una funcin, la funcin puede modifi-
NULL se utilizan slo como seales de que ha sucedido algo. En otras pala- car el contenido del array.
bras, si p es un puntero NULL, es correcto referenciar *p.
El tipo de dato void representa un valor nulo. En C++, sin embargo, el tipo de Los punteros de cadenas no son cadenas. Los punteros que localizan el pri-
puntero void se suele considerar como un puntero a cualquier tipo de dato. La mer elemento de una cadena almacenada.
idea fundamental que subyace en el puntero void en C++ es la de un tipo
que se puede utilizar adecuadamente para acceder a cualquier tipo de obje- char *varCadena;
const char *Cadenafija;
to, ya que es ms o menos independiente del tipo.
Un ejemplo ilustrativo de la diferencia de comportamiento en C y C++
es el siguiente segmento de programa.
Consideraciones prcticas
int main()
{ Todos los arrays en C++ se implementan mediante punteros:
void *vptr;
int *iptr; char cadenal[16]= Concepto Objeto;
char *cadena2 = cadena1;
vptr = iptr;
iptr = vptr; //Incorrecto en C++, correcto en C
iptr = (int *) vptr; //Correcto en C++ Las declaraciones siguientes son equivalentes y se refieren al carcter C:
...
} cadena1[0] cadena1 cadena2
punteros son: suma, resta y comparacin. As, si las sentencias siguientes se ptr1 = new int; //memoria asignada para el objeto ptr1
ejecutan en secuencia: ptr2 = new double; //memoria ampliada para el objeto ptr2
*ptr1= 5;
char *p; //p contiene la direccin de un carcter *ptr2= 6.55;
char a[10]; // array de diez caracteres
p = &a[0]; //p apunta al primer elemento del array Dado que new devuelve un puntero, se puede utilizar ese puntero para
p++; //p apunta al segundo elemento del array inicializar el puntero en una sola definicin, tal como:
p++; //p apunta al tercer elemento del array
p--; //p apunta al segundo elemento del array int* p = new int;
Un ejemplo de comparacin de punteros es el siguiente programa: Si new no puede ocupar la cantidad de memoria solicitada, devuelve un
valor NULL. El operador delete libera la memoria asignada mediante new.
#include <iostream.h>
main (void) delete ptr1;
{
int *ptr1, *ptr2; Un pequeo programa que muestra el uso combinado de new y delete es,
int a[2] = {10,10};
ptr1 =a; #include <iostream.h>
cout << ptr1 es << ptr1 << *ptr1 es << *ptr1 << endl; void main (void)
ptr2 = ptr1 + 1; {
cout << ptr2 es << ptr2 << *Ptr2 es << *ptr2 << endl; char *c;
//comparar dos punteros c = new char[512];
if (ptr1 == ptr2) cin >> c;
cout << ptr1 no es igual a ptr2 \n; cout << c << endl;
if (*ptr1 == *ptr2)
delete c;
cout << ptr1 es igual a *ptr2 \n;
}
else
cout << ptr1 no es igual a *ptr2 \n;
} Los operadores new y delete se pueden utilizar para asignar memoria
a arrays, clases y otro tipo de datos.
int * i;
B. 12. LOS OPERADORES new Y delete i = new int[2][35]; //crear el array
//asignar el array
C++ define un mtodo para realizar asignacin dinmica de memoria, dife- ...
rente del utilizado en C, mediante los operadores new y delete. delete i; //destruir el array
El operador new sustituye a la funcin malloc tradicional en C, y el
operador delete sustituye a la funcin free tradicional tambin en C; new
asigna memoria y devuelve un puntero al objeto ltimamente creado. Su Sintaxis de new y delete:
sintaxis es:
new nombre_tipo new int new char[100]
new NombreTipo
new nombre_tipo inicializador new int(99) new char(C)
y un ejemplo de su aplicacin es: new nombre_tipo new (char*)
delete expresin delete p
int *ptr1; delete[] expresin delete[]
double *ptr2;
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 579
B. 13. ARRAYS
1. Los arrays se pueden pasar como argumentos a funciones.
Un array (matriz, tabla) es una coleccin de elementos dados del mismo
4 2. Las funciones no pueden devolver arrays.
tipo que se identifican por medio de un ndice. Los elementos comienzan 3. No est permitida la asignacin entre arrays. Para asignar un array a
con el ndice 0. otro se debe escribir el cdigo para realizar las asignaciones elemen-
to a elemento.
Declaracin de arrays
int multidim[4][10][3];
donde nombre es el nombre de la variable declarada enumerada;
lista-smbolos es una lista de tipos enumerados, a los que se asigna valo-
El ejemplo tabla declara un array de 2 3 elementos. res cuando se declara la variable enumerada y puede tener un valor de ini-
cializacin. Se puede utilizar el nombre de una enumeracin para declarar
int tabla[2][3]; //array de enteros de 2x3 = 6 elementos
una variable de ese tipo (variable de enumeracin).
nombre var;
La sintaxis de una estructura es: memoria. La unin annima no tiene asignado un nombre, y en consecuen-
cia se accede a los elementos de la unin directamente. La sintaxis de una
struct nombre unin annima es:
{
miembros union {
}; int nuevoID;
int contador;
};
Un ejemplo y una variable tipo estructura se muestra en las siguientes
sentencias: Las variables de la unin annima comparten la misma posicin de
memoria y espacio de datos.
struct cuadro{
int i; int main()
float f; {
}; union{
int x;
struct cuadro nombre; //Estilo C float y;
cuadro nombre; //Estilo C++ double z;
};
Una unin es una variable que puede almacenar objetos de tipos y x = 25;
tamaos diferentes. Una unin puede almacenar tipos de datos diferentes, y = 245.245; //el valor en y sobreescribe el valor de x
slo puede almacenar una cada vez, en oposicin a una estructura que alma- z = 9.41415; //el valor en z sobreescribe el valor de z
cena simultneamente una coleccin de tipos de datos. La sintaxis de una }
unin es:
Esta lectura del teclado lee una cadena hasta que se encuentra el primer B.16.2. Definicin de funciones
carcter blanco. As, cuando se lee Sierra Mgina. Jan, en cad slo
se almacena Sierra. Para resolver el problema se utiliza la funcin gets La definicin de una funcin es el cuerpo de la funcin, que se ha declara-
(), que lee una cadena completa leda del teclado. El programa anterior se do con anterioridad.
escribe as para leer toda la cadena introducida:
double Media(double x, double y)
#include <iostream.h> //Devuelve la media de x e y
#include <stdio.h> {
return (x+y)/2.0;
main() }
{
char cad[80]; char LeerCaracter();
//Devuelve un carcter de la entrada estndar
cout << Introduzca una cadena:; {
gets(cad); char c;
cout << Su cadena es:; cin >> c;
cout << cad; return c;
}
return 0;
}
B.16.1. Declaracin de funciones Los parmetros por omisin no necesitan especificarse cuando se llama
a la funcin. Los parmetros con valores por omisin deben estar al final de
En C + + se debe declarar una funcin antes de utilizarla. La declaracin de la lista de parmetros:
la funcin indica al compilador el tipo de valor que devuelve la funcin y el
nmero y tipo de argumentos que toma. La declaracin en C++ se denomi- void func1 (int i=3, int j); //ilegal
na prototipo: void func2 (int i, int j=0, nt k=0); //correcto
void func3 (int i=2, int j, int k=0); //ilegal
void ImprimirValores (int cuenta, double cantidad=0.0);
tipoNombreFuncion (lista argumentos);
void suma(char i)
#include <iostream.h> {
int incrementar(int i); cout << Suma interior(char) << endl;
}
inline incrementar(int i)
{ void suma(float j)
i++; {
return; cout << Suma interior (float) << endl;
} }
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 583
El nivel de acceso a miembros por omisin es privado si se utiliza CDibujo::CDibujo(long c, int n, CCad dir){
class. El nivel de acceso a miembros es pblico si se utiliza union coste = c;
nEstrellas = n;
o struct.
sDirector = dir;
Las palabras reservadas struct y class crean un tipo similar a una }
estructura en C. Una union crea un tipo en la que todos los miembros
datos comienzan en la misma direccin en memoria.
class CCad{ B.17.2. Constructor por omisin
private:
char *pDatos; El constructor por omisin en cada clase es el constructor que no tiene argu-
int nLongitud; mentos. C++ lo invoca automticamente en las siguientes situaciones: cuan-
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 585
do se define un objeto de la clase sin argumentos, cuando un array de obje- Punto llamado figura, el constructor por omisin Punto se llama para
tos se declara con miembros no inicializados, o cuando el operador new se cada miembro del array
utiliza, pero no se especifica ningn argumento. La sintaxis de un construc-
tor por omisin es: Punto figura[3];
class()
vector::vector () { ... } B.17.5. Destructores
vector::vector(int i = 0) { ... }
Un destructor es una funcin miembro especial que se llama automtica-
class Punto {
mente cuando se desea borrar un objeto de la clase. El nombre de un des-
public:
tructor es el nombre de la clase, precedido por el carcter ~ (tilde). Si no se
Punto() declara explcitamente un destructor C++ crea automticamente uno vaco.
}
x = 0; class Punto{
y = 0; public:
} ~Punto()
private: {
int x; cout << Destructor Punto llamado \n;
}
int y;
//...
}; };
C++ crea automticamente un constructor por omision cuando no exis- Un destructor no tiene parmetros, ni incluso void y no tiene tipo de
te otro constructor. retorno. Una clase puede tener slo un constructor.
B.18. HERENCIA
B.19. SOBRECARGA DE OPERADORES
Una herencia es una relacin es-un entre dos clases, en la que una nueva
clase se deriva de otra clase denominada clase base. La nueva clase, se La sobrecarga de operadores se refiere a la tcnica que permite proveer un
denomina clase derivada. La relacin es-un se manifiesta como un estu- nuevo significado a los operadores estndar tales como =, < <, ... Dicho
diante de doctorado es-un estudiante que est escribiendo una tesis. de otro modo, se pueden definir funciones operador para sus clases.
Una funcin operador es una funcin cuyo nombre consta de la palabra
Sintaxis reservada operator seguida por un operador binarlo o unitario con el for-
mato:
class nombre_clase_derivada: (public|protected|private)
operator operador
clase_base {
declaraciones // Sobrecarga de operadores aritmticos y
}; // de asignacin
clase_base es el nombre de la clase del que se deriva la clase actual class Punto
derivada los especificadores de acceso pueden ser public, pro- }
tected o private. Un miembro public es accesible a travs de su //...
mbito; los miembros de clase_base se heredan sin modificacin en su public:
estado. Un miembro privado (private) es accesible a otras funciones //...
miembro dentro de su propia clase. Un miembro protegido (protected) es Punto operator * (const Punto& p);
accesible a otras funciones miembro dentro de su clase y a cualquier clase Punto operator / (const Punto& p);
Punto operator += (const Punto& p);
derivada de ella. Los modificadores de acceso se pueden utilizar dentro de
//...
una declaracin de una clase en cualquier orden y con cualquier frecuencia. };
//implementacin de funcin miembro sobrecargada
class D : public A { //p1 * p2
... inline Punto Punto::operator * (const Punto& p)
};
{
return Punto (x * p.x, y * p.y, z * p.z);
La herencia mltiple permite que una clase sea derivada de ms de una }
clase base. En el siguiente ejemplo, D es la clase derivada, y Bl, B2 y B3 son //p1 / p2
clases base. ...
588 PROGRAMACIN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS
Una vez declarada y definida la clase se pueden escribir expresiones Un ejemplo que ilustra una funcin operador de asignacin
tales como:
class Cpunto {
Punto p, q, r; private:
//... double x, y;
r = p * q; //multiplicacin public:
//... Cpunto& operator = (const Cpunto& punto);
r = p + = q; //asignacin encadenada y aritmtica ...
//... };
class P {
B.19.2. Funciones operador binario public:
void operator++(int);
Se puede escribir una funcin operador binario para un operador (tal como void operator--(int);
+, , *, ) que C++ acepta como un operador binario };
el compilador evala la expresin llamando a una de las siguientes funcio- B.20. PLANTILLAS (templates)
nes, dependiendo de en cul est definida
La palabra reservada template se utiliza para implementar tipos
tipo_retorno tipo1::opera tor@ (tipo2) parametrizados o plantillas. C++ reconoce dos tipos de plantillas: planti-
tipo_retorno tipo2::operator@ (tipo1, tipo2) llas de clases y plantillas de funciones.
tipol y tipo2 son los tipos de operando1 y operando2, respectiva-
Sintaxis
mente.
template < argumentos_plantilla > //plantilla de clase
declaracin_de_clase
B.19.3. Funciones operador de asignacin
template < argumentos_plantilla > //plantilla de funcin
La declaracin de esta funcin es: definicin_funcin
class & clase::operator = (const clase &) < argumentos_plantilla > es class arg_nombre
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 589
B.20.1. Plantillas de funciones T puede ser un tipo o una expresion. Las plantillas se instancian para
crear clases a partir de ellas.
Una plantilla de funcin debe tener al menos un tipo de parmetro, pero
puede tener ms. Su formato es: MiClase <int> x;
MiClase <Estudiante> miEstudiante;
template <classT>
tipo-retorno nombre-funcin(T parmetro) Una plantilla puede tener mltiples parmetros
En C++, cuando se genera una excepcin, el error no se puede ignorar catch (const char* mensaje)
o terminar el programa. Un programa lanza o dispara (throws) una excep- {
cin en el punto en que se detecta el error. Cuando sucede esto, un progra- cerr << mensaje << endl;
exit(1);
ma C++ busca automticamente el manipulador de excepciones, que res-
}
ponde a la excepcin de algn modo apropiado. Esta respuesta se denomina
capturar una excepcin (catching). Si no se puede encontrar un manipu-
lador de excepciones el programa terminar.
B.21.3. Especificacin de excepciones
Sintcticamente, una especificacin de excepciones es parte de una decla-
B.21.1. Lanzamiento de excepciones racin de funciones y tiene el formato:
Pueden ocurrir muchos tipos diferentes de excepciones, de modo que cuando
cabecerafuncin throw (lista de tipos)
se lanza una excepcin, una expresin throw excepcin (o slo throw)
identifica el tipo de excepcin. La sintaxis adopta dos formatos:
La lista de tipos son los tipos que pueden tener una sentencia throw
throw expresin dentro de la llamada de la funcin; si la lista es vaca, el compi-
throw expresin lador puede suponer que ninguna sentencia throw se ejecutar por la fun-
//lanzamiento de una excepcin, creando un subndice cin, bien directa o bien indirectamente
//est fuera de rango
const unsigned LongArray = 500; void demo() throw(int, desbordamiento);
unsigned i; void nodemo(int i) throw();
.
.
. As, una declaracin de funcin:
if (i > = LongArray) //es el subndice vlido
throw ErrorRango; void Demo() throw (A, B)
{
La palabra reservada try, junto con las sentencias que le siguen ence- //...
rradas entre llaves, se llama un bloque try. Debe ser seguido inmediatamen- }
te por uno o ms manejadores de excepciones. Cada manejador de excep-
ciones comienza con la palabra reservada catch seguida por un bloque que se tratar del siguiente modo:
contiene sentencias.
void Demo()
try {
{ try {
lista_de_sentencias
//...
}
llamada a Demo()
catch (lista_de_parmetros){
}
lista_de_sentencias
} catch (A)
catch (lista_de_parmetros){ throw;
lista_de_sentencias }
} catch (B)
}
//...
}
B.21.2. Manejador de excepciones catch (...)
{
Un bloque catch se conoce tambin como manejador de excepciones y se //unexpected
parece a una declaracin de funcin de un argumento sin un tipo de retorno. }
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 591
Si una funcin no est especificada con una declaracin throw puede class range_error : public runtime-error
lanzar cualquier excepcin. La declaracin throw() indica que una funcin {
no lanza ninguna excepcin. public:
range_error;
Si una funcin lanza una excepcin que no est en su declaracin, se llama
{
a la funcin unexpected. En la mayora de las implementaciones, unexpec- const string & que_arg;
ted llama a terminate que llama a abort. La funcin set_unexpected }
permite definir el manejo de excepciones no previstas. Todas estas declaracio- };
nes de funciones se encuentran en al archivo except o bien except.h.
enumeraciones (enum), definiciones de tipos (typedef) o bien otras definiciones B.22.2. Acceso a los miembros de un espacio de nombre
de espacios de nombres. Obsrvese que un espacio de nombre no termina con
un punto y coma. Las definiciones de espacio de nombres aparecen en archi- El operador de resolucin de mbito proporciona acceso a miembros de un
vos de cabecera y en mdulos independientes con definiciones de funciones. espacio de nombre.
Ejemplo nombre_espacio_de-nombre::nombre_miembro
namespace Rojo {
nombre_espacio_de_nombre es un cualificador de espacio de nombre
int j;
void imprimir(int i) definido con anterioridad y nombre_miembro debe estar declarado dentro
{cout << Rojo::imprimir() << i << endl;} de nombre_espacio_de_nombre.
}
void Azul::imprimir(int k){
namespace Azul { cout << Azul::imprimir() = << k << endl;
int j;
}
void imprimir(int);
}
void sub1() {...} //puede acceder a espacio de nombres El operador de resolucin de mbito asocia imprimir() con el espacio
//Azul y Rojo de nombre Azul; sin el mismo, el compilador define imprimir() como
void sub() {...} //puede acceder a espacio de nombres una funcin global.
//Azul y Rojo
Los espacios de nombre son extensibles; es decir, se pueden aadir declara- Todos los miembros definidos en cuerpo_nombre_de_espacio estn
ciones posteriores a espacios de nombre definidos anteriormente. Las exten- en un espacio de nombre sin nombre que se garantiza nico para cada uni-
siones del espacio de nombres pueden aparecer tambin en archivos inde- dad de traduccin.
pendientes de la definicin original del espacio de nombre.
namespace Azul{ //definicin original de espacio de nombre
int j; B.22.4. Directivas using
void imprimir (int);
} El acceso a los miembros de espacio de nombre puede tener dificultades,
especialmente con calificadores de espacio de nombre largos y espacios de
namespace Azul{ //extensin del espacio de nombre nombre anidados. Las directivas using proporcionan acceso a todos los
char car; miembros del espacio de nombre sin un cualificador de espacio de nombre
char bufer[20];
y el operador de mbito. El formato es:
}
... using namespace nombre;
GUA DE SINTAXIS ANSI/ISO ESTNDAR C++ 593
El cualificador nombre debe ser un nombre de espacio definido anterior- // uso de alias para abreviaturas
mente. Pueden aparecer las directivas using en mbitos locales y globales. namespace UPSAM = Universidad_Pontificia_deSalamanca_enMadrid;
UPSAM::String c3 = Fundacin;
UPSAM::String c4 = Pablo VI;
B.22.5. Declaraciones using namespace Geometria{
struct Punto {
Las directivas using hacen a todos los miembros del espacio de nombre double x, y;
accesibles sin cualificacin. En contraste, las declaraciones using cualifi- };
can slo miembros individuales de espacio de nombre. El formato es: double pendiente (Punto, Punto);
}
using nombre_espacio_de_nombre::nombre-miembro;
El espacio de nombres incluye un tipo Punto y una funcin pendien-
namespace Negro{ //define espacio de nombre Negro te. La implementacin del archivo geometria.c
int j;
void imprimir(int); // geometria.c
char car; #include geometria.h
}
namespace Blanco{ namespace Geometria { // extensin de espacio de nombre
int j; Punto origen = {0, 0};
void imprimir(int); }
double vision; double Geometria::pendiente (Punto p1, Punto p2){
} double dy = p2.y - p1.y;
double dx = p2.x - p1.x;
using Blanco::vision; if (dx = = 0)
throw pendiente() : pendiente no definida;
return dy / dx;
}
B.22.6. Alias de espacio de nombres
Una extensin del espacio de nombre ha aadido un miembro origen
Los alias de espacio de nombres crean nombres sinnimos de espacio de a Geometria. La funcin pendiente() calcula la pendiente de los puntos
nombres. Es buena prctica utilizar alianzas cuando un espacio de nombre pl y p2 y levanta una excepcin de cadena de caracteres si el denominador
tiene un nombre largo. El formato es: de la pendiente es cero.
namespace nombre_alias = nombre_de_espacio;
using Geo::Punto;
using Geo::pendiente;