Академический Документы
Профессиональный Документы
Культура Документы
Facultad de Informatica
Universidad Politecnica de Valencia
Curso 2009/2010
Tema 1:
Introduccion a la programacion con C++
FI UPV: Curso 2009/2010
EDA-Tema1
TEMA 1. Introduccion a la programacion con C++
Objetivos
Aprender algunos conceptos del lenguaje C++ con el n de poder utilizarlo a lo largo
de la asignatura. Es decir, no necesitamos saber todos los detalles y conceptos de este
lenguaje.
Conocimientos previos
Se asume que ya se sabe programar en lenguaje C.
Contenidos
1 Conceptos basicos de C++.
2 Clases en C++.
3 Algunas libreras estandar.
Bibliografa
C++ estandar , de Enrique Hernandez Orallo et al.
The C++ Programming Language, de Bjarne Stroustrup.
FI UPV: Curso 2009/2010 Pagina 1.1
EDA-Tema1
El lenguaje C++
Dise nado por Bjarne Stroustrup en los Laboratorios AT&T a principios de los a nos 80. Es
una extension de C (salvo detalles, C es un subconjunto de C++).
Objetivos del dise no de C++:
Soporte para la programacion modular: Espacios de nombres.
Soporte para la programacion orientada a objetos: Clases.
Soporte para la programacion generica (plantillas). No todos los lenguajes orientados a
objetos la soportan.
Al igual que C, se trata de un lenguaje donde la eciencia en tiempo de ejecucion se
considera importante.
Por tanto, hay dos clases de extensiones respecto de C:
Extensiones no orientadas a objetos: Espacios de nombre, sobrecarga de funciones y
de operadores, plantillas, nuevos tipos de datos, funciones inline, nuevos comentarios,
nuevas libreras, etc.
Extensiones relacionadas con la programacion orientada a objetos: Clases.
FI UPV: Curso 2009/2010 Pagina 1.2
EDA-Tema1
C++ no tiene soporte (estandar) para:
Concurrencia.
Recoleccion automatica de memoria (como ocurre, por ejemplo, en Java).
C++ soporta programacion orientada a objetos, pero no es imprescindible (se puede
utilizar C++ sin objetos).
Compatibilidad con librerias C y herramientas UNIX (make) para reutilizacion de codigo.
Se ha convertido en un estandar de programacion: iso/iec 98-14882. Esto proporciona
estabilidad al lenguaje. Este estandar incluye una biblioteca estandar muy amplia que
incluye, entre otras cosas, la Standard Template Library: STL consistente en contenedores
(vectores, listas, diccionarios, etc.), algoritmos e iteradores genericos que se pueden
instanciar a diversos tipos de datos.
FI UPV: Curso 2009/2010 Pagina 1.3
EDA-Tema1
Conceptos basicos de C++
Comentarios.
/
*
...
... comentario que puede abarcar multiples lneas
...
*
/
Estos comentarios no se pueden anidar.
// ... comentario hasta el final de la lnea
http://xkcd.com/156/
FI UPV: Curso 2009/2010 Pagina 1.4
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Tipos fundamentales
Vienen denidos por el propio lenguaje, en C++ se dividen en:
Enteros o discretos (integral types)
Tipos maquina: bool, char, short, int, long.
Tipos enumerados: enum.
Reales (coma otante): float, double, long double.
void.
se usa en funciones y punteros.
no se pueden declarar variables de ese tipo.
no consume memoria y no hay ningun operador aplicable a el.
FI UPV: Curso 2009/2010 Pagina 1.5
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Tipo bool
Puede tener dos valores: true y false
El tama no no esta establecido en el estandar, suele ser un byte.
Los valores numericos se convierten implcitamente a tipos booleanos.
Valores distintos de cero se convierten a true y el cero a false.
Los punteros tambien se convierten implcitamente.
Puntero a NULL o cero se convierte a false y el resto se considera true.
Literales: los valores true y false
FI UPV: Curso 2009/2010 Pagina 1.6
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Tipos enteros
Podemos tener distintos tama nos mnimos: short, int, long.
2 sizeof(short)
4 sizeof(long)
sizeof(short) sizeof(int) sizeof(long)
Literales: Podemos utilizar distintas bases numericas:
Decimal: No empieza por 0 (para el literal 0 da igual la base).
Octal: Empiezan por 0. Ejemplo: 010 es como poner 8
Hexadecimal: Empiezan por 0x o por 0X.
Para los valores de 10 a 15 se utilizan las letras ABCDEF o tambien abcdef.
El sujo fuerza el tipo del literal:
u o U para que sea de tipo unsigned.
l o L para que sea de tipo long.
Ejemplo: 0xAAuL es un valor 10 16 + 10 = 170 unsigned long.
FI UPV: Curso 2009/2010 Pagina 1.7
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Tipos reales
Diferentes representaciones: float, double, long double.
Tama no dependiendo de la arquitectura, ejemplo:
oat 32 bits
double 64 bits
long double 96 bits
Literales: Consiste en una parte entera, un punto decimal, una parte fraccionaria y, opcional-
mente, un caracter e o E, un exponente entero con signo opcional. Se puede a nadir un sujo
para indicar el tipo (sin sujo se considera double, con f o con F se considera float y
con l o con L es long double). Ejemplos:
0.5F 0,5 float
0.25 0,25 double
-1.0e5L 100 000 long double
FI UPV: Curso 2009/2010 Pagina 1.8
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Caracteres
Tipo char, tama no: 1 byte.
Las variables y literales de tipo char se pueden sumar, restar, etc. ya que son de tipo
aritmetico.
Literales: Se delimita por dos apostrofes . El caracter de escape \ sirve para codicar
algunos caracteres como \n, etc.
Cadenas: Secuencia (vector) de caracteres acabados en el caracter nulo \0
Literales: Las cadenas se delimitan con comillas "", ejemplo: "Hola\nmundo\n"
FI UPV: Curso 2009/2010 Pagina 1.9
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Tipos enumerados
Sirven para denir un tipo que solo puede tomar valores dentro de un conjunto nito.
La sintaxis es:
enum nombre {Valor1, Valor2, Valor3, ...};
Ejemplos:
enum palo {Oro, Basto, Espada, Copa};
enum respuesta {SI, NO};
Los nombres de los valores deben ser distintos entre s:
enum palo {Oro, Basto, Espada, Copa};
enum premio {Oro, Plata, Bronce}; // PROBLEMA!!!!
program.cc:5: error: conflicting types for oro
program.cc:4: error: previous declaration as palo oro
FI UPV: Curso 2009/2010 Pagina 1.10
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Tipos derivados
Se obtienen de los tipos fundamentales usando los siguientes smbolos de declaracion:
*
Punteros
& Referencias
[] Vectores (arrays)
() Funciones
FI UPV: Curso 2009/2010 Pagina 1.11
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Punteros
Para un tipo dado T, el tipo puntero a ese tipo es T
*
. Ejemplos:
int
*
p; // puntero a entero
int
*
q,r; // q es puntero a entero pero r es de tipo int
char
**
c; // puntero a un puntero a caracter
El puntero NULL Se trata de un puntero 0. Cualquier indireccion de este puntero se convierte
en un error de ejecucion. El identicador NULL no es reservado y hay que incluirlo desde
alguna de estas cabeceras:
<cstddef> // definiciones estandar de C
<cstdlib> // librera estandar de C
Puesto que el 0 tiene conversion estandar a puntero, podemos usar simplemente el 0 en vez
de NULL.
FI UPV: Curso 2009/2010 Pagina 1.12
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Vectores
Una variable indexable que contiene muchos objetos de un mismo tipo que se almacenan
consecutivamente en memoria. Para un vector de n elementos, los ndices validos son los
enteros del 0 al n-1.
Controlar el acceso dentro del vector es responsabilidad del programador.
Los vectores se pueden inicializar poniendo elementos entre llaves y separados por comas.
Ejemplo:
int m[2][3] = { {1,2,3}, {4,5,6} };
char cad1[5] = {H,o,l,a,\0}; // OJO, HAY QUE PONER \0
char cad2[5]= "Hola"; // es equivalente a lo anterior
char cad2[]= "Hola"; // es equivalente a lo anterior
FI UPV: Curso 2009/2010 Pagina 1.13
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Relacion entre vectores y punteros
Cuando denimos un vector, por ejemplo:
int v[10];
se dene a como un vector de 10 enteros y se reserva espacio necesario para esos diez
enteros.
El operador [] se convierte a operaciones sobre punteros, as es equivalente:
v[4]; // quinto elemento de v
*
(v+4); // equivalente a lo anterior
En general a[b] es equivalente a
*
((a)+(b))
El tipo de v es int[]. Hay una conversion desde T[] a T
*
, por tanto si escribimos:
int v[10];
int
*
p = v;
resulta que p y v son punteros al mismo tipo, pero v es un puntero constante no ocupando
memoria.
FI UPV: Curso 2009/2010 Pagina 1.14
EDA-Tema1
p = v; /
*
es valido
*
/ v = p; /
*
INVALIDO
*
/
p += 4; /
*
valido
*
/ v++; /
*
INVALIDO
*
/
En el caso de vectores multidimensionales hay que saber como se organizan en memoria.
1 #include <iostream>
2 using namespace std;
3 int main () {
4 int m[4][5];
5 // poner int
*
p = m; da error:
6 // error: cannot convert int (
*
)[5] to int
*
7 int (
*
p)[5] = m; // esto s que funciona
8 // forzando un casting vemos la matriz como vector por filas:
9 int
*
q = (int
*
)m;
10 for (int i=0;i<20;i++) q[i] = i;
11 // imprimimos el vector:
12 for (int i=0;i<4;i++)
13 for (int j=0;j<5;j++)
14 cout << "m["<<i<<"]["<<j<<"] = "<<m[i][j]<<endl;
15 cout << "m[2][2] = "<<
*
(
*
(m+2)+2) << endl;
16 return 0;
17 }
FI UPV: Curso 2009/2010 Pagina 1.15
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Memoria dinamica
Para pedir memoria dinamica se utilizan los operadores new y delete que son una
alternativa a las funciones malloc() y free() de C. Ejemplo:
1 int main() {
2 int
*
a = new int; // poco habitual reservar un int
3 int j = 20;
4 int
*
v = new int[j]; // reservamos un vector de 20 enteros
5 // observa que el argumento j no es constante...
6 v[0] = 5;
7 delete a;
8 delete[] v; // OJO! Es un error frecuente poner delete v
9 return 0;
10 }
FI UPV: Curso 2009/2010 Pagina 1.16
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Memoria dinamica
Para crear vectores multidimensionales, solo la primera de las dimensiones puede venir dada
en tiempo de ejecucion:
1 #include <iostream>
2 using namespace std;
3 int main () {
4 int n = 10, k=0;
5 const int cols = 5; // DEBE SER CONSTANTE
6 int (
*
m)[cols] = new int [n][cols];
7 for (int i=0;i<n;i++)
8 for (int j=0;j<cols;j++)
9 m[i][j] = k++;
10 for (int i=0;i<n;i++)
11 for (int j=0;j<cols;j++)
12 cout<<"m["<<i<<"]["<<j<<"] = "<<m[i][j]<<endl;
13 delete[] m;
14 return 0;
15 }
FI UPV: Curso 2009/2010 Pagina 1.17
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Referencias
Una referencia es como un nombre alternativo o alias. La notacion T& signica referencia a
tipo T. Por ejemplo:
int a = 1;
int &r = a; // r y a se refieren al mismo entero
int x = r; // x = 1
r = 2; // a = 2
Restricciones:
Las referencias deben inicializarse cuando se declaran (excepto en argumentos por referencia
a funciones y referencias externas).
Una vez inicializadas, no pueden modicarse.
No se pueden crear referencias a referencias ni punteros a referencias.
El principal uso de las referencias es la denicion de argumentos y retorno por referencia en
funciones.
FI UPV: Curso 2009/2010 Pagina 1.18
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Paso de parametros por referencia
Pasando punteros a la variable a modicar (como en C).
Utilizar el tipo derivado tipo &variable
Ejemplo:
1 void intercambio1(int
*
a, int
*
b) { // (utilizando punteros)
2 int temp =
*
a;
3
*
a =
*
b;
4
*
b = temp;
5 }
6 // la llamada: intercambio1(&i,&j);
7 void intercambio2(int &a, int &b) { // (utilizando referencias)
8 int temp = a;
9 a = b;
10 b = temp;
11 }
12 // la llamada: intercambio2(i,j);
FI UPV: Curso 2009/2010 Pagina 1.19
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Tipos compuestos
Sirven para poder agrupar un conjunto o coleccion de variables del mismo o diferente tipo en
un nuevo tipo. Cada variable perteneciente a un tipo compuesto se llama miembro o campo.
Hay 4 tipos compuestos en C++:
Estructuras (struct)
Uniones (union)
Campos de bits
Clases (class)
No vamos a estudiar ni las uniones ni los campos de bits. Las clases se veran mas tarde.
FI UPV: Curso 2009/2010 Pagina 1.20
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
Estructuras
Permiten agrupar distintos elementos bajo un mismo tipo.
Los miembros de una estructura se acceden por su identicador (nombre del campo o
miembro).
Los distintos miembros se almacenan consecutivamente en memoria, pero ojo! el com-
pilador puede a nadir bytes extra entre distintos miembros para forzar determinados
alineamientos de la memoria.
Sintaxis:
struct nombre {
tipo1 vartipo1;
tipo2 vartipo2;
....
} variable1,variable2,...,variable_n;
donde o bien nombre o bien las variables variable1,. . . son opcionales.
FI UPV: Curso 2009/2010 Pagina 1.21
EDA-Tema1
Al declarar una variable, argumento,. . . de un tipo struct previamente podemos poner
o no la palabra struct, ejemplo:
struct tupla { int a, b; }; // definimos una tupla
....
tupla x; // valido
struct tupla y; // tambien es valido, as es como en C.
Los distintos campos de una estructura se acceden con el operador . (es decir, un punto).
Ejemplo:
struct complejo { double real, imaginaria; };
complejo a,b,c;
a.real = a.imaginaria = 0; // a = 0
b.real = 1;
b.imaginaria = 2;
c.real = a.real + b.real;
c.imaginaria = a.imaginaria + b.imaginaria;
// ;) en breve podremos hacer c = a+b;
FI UPV: Curso 2009/2010 Pagina 1.22
EDA-Tema1
Conceptos basicos de C++
Tipos de datos
typedef
Se utiliza para crear un nuevo tipo, por ejemplo:
typedef int entero;
A partir de esta declaracion podemos utilizar enteros para cualquier cosa que pudiesemos
hacer con int. Ademas, ambos tipos son completamente compatibles entre s:
entero a = 5;
int b;
b = a;
FI UPV: Curso 2009/2010 Pagina 1.23
EDA-Tema1
Esquema de tipos de datos
Fundamentales
& referencia
puntero
*
[]
funcion ()
vector
Discretos
(integrales)
Coma flotante
float
double
long double
bool
char
int
short
long
enum
Aritmeticos
Derivados
Compuestos
struct
class
union
campo de bit
TIPOS
void
FI UPV: Curso 2009/2010 Pagina 1.24
EDA-Tema1
Operadores
C++ dispone de gran n umero de operadores
De distintas aridades: los hay unarios, binarios y ternarios.
Con distintas notaciones: preja, inja, suja.
Para evitar ambiguedades cuando no hay parentesis:
Distintos tipos de asociatividad: a la derecha y a la izquierda.
Distintas precedencias.
Los tipos basicos de operadores son:
Aritmeticos.
De comparacion y logicos.
De bit.
De asignacion.
De indireccion.
De evaluacion.
Condicional.
Operadores sizeof.
Operadores de conversion.
FI UPV: Curso 2009/2010 Pagina 1.25
EDA-Tema1
Operadores
Operandos destino (lvalue)
Un operador act ua sobre uno o mas operandos. Estos operandos pueden ser muy diversos:
variables, constantes, funciones, etc.
Hay un tipo de operando que interesa caracterizar: los operandos destino (tambien llamados
lvalue) son aquellos a los que se les pueden asignar valores. Por tanto, deben designar una
region de almacenamiento. Por ejemplo, dadas las deniciones:
char cadena[100];
int i,
*
p;
struct complejos { double real, imaginaria } co1;
Algunos ejemplos validos de operando destino son:
p // puntero a int
i // un entero int
cadena[20] // un caracter
co1.real // un double
FI UPV: Curso 2009/2010 Pagina 1.26
EDA-Tema1
Operadores
Operadores aritmeticos
+ Suma.
- Resta.
*
Producto.
/ Division.
% M odulo, solo para valores integrales (enteros,char,. . . )
+(unario) No hace nada, mantiene el signo.
-(unario) Cambio de signo.
Incremento y decremento
El operador ++ suma una unidad.
El operador -- resta una unidad.
Se aplican a operandos destino.
Se aplican a todos los tipos fundamentales excepto void y tambien a los punteros.
Aplicado sobre punteros avanza tantos bytes como sizeof del tipo que apunte el puntero.
Devuelven el valor. Se pueden situar antes o despues. Si lo situamos antes (pre), realiza
la operacion antes de devolver el valor. Si lo situamos despues (post), devuelve el valor
antes de la operacion.
FI UPV: Curso 2009/2010 Pagina 1.27
EDA-Tema1
Operadores
Operadores de comparacion y logicos
< Estrictamente menor.
> Estrictamente mayor.
<= Menor o igual.
>= Mayor o igual.
== Igual. No confundir con la asignacion (=).
!= Distinto de.
Otros operadores son:
! Negacion.
&& Producto (y,and) logico de 2 expresiones.
|| Suma (o,or) logica de 2 expresiones.
El orden de evaluacion de || y de && esta denido de izquierda a derecha.
Si el operador && no cumple la primera expresion, no se eval ua la segunda.
Si el operador || cumple la primera expresion, no se eval ua la segunda.
FI UPV: Curso 2009/2010 Pagina 1.28
EDA-Tema1
Operadores
Operadores de bit
& Producto (y,and) unario de bits.
| Suma (o,or) binaria de bits.
Suma binaria exclusiva (xor,orex) de bits.
<< Desplazamiento del primer operando hacia la izquierda
un n umero de bits marcado por el segundo operando.
>> Desplazamiento del primer operando hacia la derecha
un n umero de bits marcado por el segundo operando.
Complemento a 1 (cambia unos por ceros y viceversa).
- Complemento a 2 (cambia de signo).
No se deben confundir con los operadores logicos. Por ejemplo, 2 & 1 vale 0 pero
2 && 1 da true puesto que tanto 2 como 1 son != 0.
Los operadores de bit pueden ser utiles para hacer mascaras de bit. Ejemplo: n & 31 es
como hacer n % 32. Tambien para multiplicar o dividir por potencias de 2.
FI UPV: Curso 2009/2010 Pagina 1.29
EDA-Tema1
Operadores
Operadores de asignacion
= Asignacion.
+= Asignacion-suma.
-= Asignacion-resta.
*
= Asignacion-producto.
/= Asignacion-division.
%= Asignacion-resto.
<<= Asignacion-desplazamiento izquierda.
>>= Asignacion-desplazamiento derecha.
&= Asignacion-producto binario.
|= Asignacion-suma binaria.
= Asignacion-suma binaria exclusiva.
El operador de asignacion necesita un operando destino a la izquierda. El operando de la
izquierda toma el valor del de la derecha. Todo el conjunto se puede utilizar como operando
de otra expresion (este es uno de los motivos por el cual el compilador no se queja cuando
confundes un = por un ==). Por tanto, las siguientes sentencias son totalmente validas:
i = j = k = 5; a = (b = funcion(12))
*
3;
FI UPV: Curso 2009/2010 Pagina 1.30
EDA-Tema1
Operadores
Operadores de indireccion
*
Indireccion.
& Direccion (referencia).
-> Indireccion de objeto y seleccion de miembro.
. Seleccion de miembro.
[] Indexacion (subndice).
->
*
Indireccion de objeto e indireccion de miembro.
.
*
Indireccion a miembro.
Los veremos mas tarde.
FI UPV: Curso 2009/2010 Pagina 1.31
EDA-Tema1
Operadores
Nombres alternativos
Palabra reservada Equivalencia
and &&
or ||
not !
not_eq !=
bitand &
and_eq &=
bitor |
or_eq |=
xor
xor_eq =
compl
FI UPV: Curso 2009/2010 Pagina 1.32
EDA-Tema1
Operadores
Operandor de evaluacion
El operador de evaluacion es la coma (,). Sirve para evaluar expresiones consecutivas pero
quedandose con el resultado de una sola. La evaluacion es de izquierda a derecha y el
resultado es el de la derecha. Ejemplo:
int i,j;
for (i=0, j = 10; i < 10; i++,j--)
cout << i << " + " << j << " = 10\n";
en este caso el resultado de la expresion daba igual. Otro ejemplo:
if (f1(),f2()) { ... }
el resultado del if depende de f2(), pero f1() se ha evaluado primero.
FI UPV: Curso 2009/2010 Pagina 1.33
EDA-Tema1
Operadores
Operandor condicional
Tiene una sintaxis peculiar, es un operador ternario. Sintaxis:
(expresion1) ? expresion2 : expresion3
Su uso no es muy com un y puede ser sustituido por una expresion if else.
Ejemplo:
if (a > b)
maximo = a;
else
maximo = b;
Utilizando el operador ? : quedara as:
maximo = (a > b) ? a : b;
FI UPV: Curso 2009/2010 Pagina 1.34
EDA-Tema1
Operadores
Operandor sizeof
Devuelve la longitud (en bytes) de un tipo de datos.
Retorna un valor de tipo size_t denido en <cstddef> y que suele ser similar al tipo
unsigned.
En realidad, este operador no realiza ninguna operacion. El compilador lo convierte en una
constante.
Se puede aplicar tanto a tipos como a variables, teniendo distinta sintaxis:
sizeof (x); // tamano de x un tipo o variable
sizeof variable; // tamano de una variable
Para vectores, sizeof devuelve el tama no en bytes, no el n umero de elementos.
El tama no de una estructura puede diferir de la suma de tama nos de cada miembro debido
al alinemiento que fuerza el compilador. Ejemplo:
struct variopinto { char c; int a; char d; };
sizeof(variopinto) vale 12 y no 1+4+1=6 (con g++ en Linux PC)
struct variopinto2 { char c,d; int a; };
sizeof(variopinto2) vale 8
FI UPV: Curso 2009/2010 Pagina 1.35
EDA-Tema1
Operadores
Precedencia y asociatividad
La asociatividad indica en que orden se asocian los operandos. Puede ser:
De izquierda a derecha. Ej: a
*
b
*
c sera (a
*
b)
*
c
De derecha a izquierda. Ej: a=b=c sera a=(b=c)
No tiene asociatividad. Ej: &a
No hay que confundir la asociatividad de los operandos con la evaluacion de los mismos.
Que se asocien de izquierda a derecha no quiere decir que tambien se eval uen de ese
modo. Ejemplo:
i = f1() + f2() + f3();
se puede ejecutar primero f1() y despues f2() o al reves. Si el orden fuese importante
tendramos que hacer lo siguiente:
i = f1(); i += f2(); i += f3();
En C++ existe una precedencia ja, una asociatividad bien denida, pero el orden de
evaluacion no esta prejado y dependera del compilador. Por tanto, en casos en que sea
importante el orden de evaluacion hay que separar las expresiones convenientemente.
FI UPV: Curso 2009/2010 Pagina 1.36
EDA-Tema1
Tablas de precedencia y asociatividad (I)
La tabla esta organizada de mayor a menor precedencia.
ID = Izquierda a Derecha, DI = Derecha a Izquierda, NO = No hay asociatividad.
Operando As. Descripcion Sintaxis
:: NO Resolucion de ambito nombre_clase::miembro
:: NO Operador de ambito ::nombre
. ID Seleccion de miembro estructura.miembro
-> ID Puntero a miembro puntero->miembro
[] ID Subndice puntero[ expr ]
() ID Llamada a funcion nombre_funcion()
() NO Conversion estilo C++ tipo ( expr )
++ NO Post-incremento lvalue++
-- NO Post-decremento lvalue--
sizeof NO Tama no de un objeto sizeof expr.
sizeof() NO Tama no de un tipo sizeof ( tipo ).
++ NO Pre-incremento ++lvalue
-- NO Pre-decremento --lvalue
- NO Complemento - expr
! NO Negacion logica ! expr
- NO Negativo (unario) - expr
+ NO Positivo (unario) + expr
FI UPV: Curso 2009/2010 Pagina 1.37
EDA-Tema1
Tablas de precedencia y asociatividad (II)
Operando As. Descripcion Sintaxis
& NO Referencia & lvalue
*
NO Indireccion
*
expr
new NO Crear objeto new tipo
delete NO Destruir objeto delete puntero
delete[] NO Destruir array delete [] puntero
() DI Conversion estilo C (tipo) expr
.
*
ID Seleccion miembro objeto.ptr_miembro
->
*
ID Puntero miembro ptr->ptr_miembro
*
ID Multiplicacion expr
*
expr
/ ID Division expr / expr
% ID Resto expr % expr
+ ID Suma expr + expr
- ID Resta expr - expr
<< ID Desplazamiento izquierda expr << expr
>> ID Desplazamiento derecha expr >> expr
< ID Menor que expr < expr
<= ID Menor o igual que expr <= expr
> ID Mayor que expr > expr
>= ID Mayor o igual que expr >= expr
== ID Igual que expr == expr
!= ID No igual que expr != expr
FI UPV: Curso 2009/2010 Pagina 1.38
EDA-Tema1
Tablas de precedencia y asociatividad (III)
Operando As. Descripcion Sintaxis
& ID Producto de bits (AND) expr & expr
ID Suma exclusiva (XOR) expr expr
| ID Suma de bits (OR) expr | expr
&& ID Y logico (AND) expr && expr
|| ID O logico (OR) expr || expr
?: DI Expresion condicional expr ? expr : expr
= DI Asignacion simple lvalue = expr
*
= DI Multiplicacion y asignacion lvalue
*
= expr
/= DI Division y asignacion lvalue /= expr
%= DI Resto y asignacion lvalue %= expr
+= DI Suma y asignacion lvalue += expr
-= DI Resta y asignacion lvalue -= expr
<<= DI Despl.izq. y asignacion lvalue <<= expr
>>= DI Despl.der. y asignacion lvalue >>= expr
&= DI AND y asignacion lvalue &= expr
|= DI OR y asignacion lvalue |= expr
= DI XOR y asignacion lvalue = expr
, ID Coma (eval. secuencia) expr , expr
FI UPV: Curso 2009/2010 Pagina 1.39
EDA-Tema1
Conversion de tipos
C++ es estricto con respecto a los tipos. Un valor de un tipo no se puede asignar a un
operador destino de otro tipo (con bastantes excepciones que vamos a ver). Para evitar
un error, se puede forzar una conversion entre tipos utilizando un casting al estilo de C,
por ejemplo:
char c;
int i;
c = (char)i;
c = char(i); // esta forma es valida en algunos casos
Los tipos aritmeticos pueden ser mezclados libremente en asignaciones y expresiones. La
asignacion de un tipo de mas bits a un operador destino de menos bits conlleva una
perdida de informacion, es una causa de errores y la conversion puede depender de la
implementacion. Como regla general:
Entre tipos integrales cuando queramos pasar de un escalar de mayor tama no a uno
de menor tama no habra un trucamiento de los bits de mayor orden.
Los tipos reales (float, double, long double) pueden asignarse entre s y con
los discretos se utiliza redondeo.
FI UPV: Curso 2009/2010 Pagina 1.40
EDA-Tema1