Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NOTAS DIGITALES
B.TECH
(I AÑO - II SEM)
(2018-19)
LNVETOLEARN&LEARNTO
Objetivos
• Enseñar al alumno los conceptos de programación orientada a objetos y a procedimientos
• Diferenciar entre funciones, clases y objetos
• Aprender a sobrecargar funciones y operadores
• Diseñar aplicaciones utilizando técnicas de gestión dinámica de la memoria
• Enseñar al alumno a aplicar la programación genérica y el tratamiento de excepciones
Unidad I
Introducción a la Programación Orientada a Objetos: Paradigma orientado a objetos-Diferencias
entre Programación Orientada a Objetos y Programación Orientada a Procedimientos, Conceptos
básicos de la Programación Orientada a Objetos, Encapsulamiento, Herencia y Polimorfismo,
Beneficios de la POO, Estructura de un programa C++, Espacio de nombres, Tipos de datos, Tokens C+
+, Identificadores, Variables, Constantes, Operadores, Estructuras de control y Bucles.
Unidad-II
Funciones, clases y objetos:
Introducción de Clases, Definición de Clases, Definición de Miembros, Objetos, Control de Acceso,
Ámbito de Clase, Operador de Resolución de Ámbito, Funciones Inline, Asignación de Memoria para
Objetos, Miembros de Datos Estáticos, Funciones de Miembros Estáticos, Arrays de Objetos, Objetos
como Argumentos de Funciones, Funciones Amigas.
Unidad-III
Constructores, destructores, herencia:
Introducción a los Constructores, Constructores por defecto, Constructores parametrizados, Copiar
Constructores, Múltiples Constructores en una Clase, Destructores.
Herencia :
Introducción a la herencia, Definición de clases derivadas, Herencia simple, Herencia múltiple,
Herencia multinivel, Herencia jerárquica, Herencia híbrida.
Unidad-IV
Punteros, funciones virtuales y polimorfismo:
Introducción a la gestión de memoria, operador new y operador delete, punteros a objetos, punteros
a clases derivadas, polimorfismo, polimorfismo en tiempo de compilación, polimorfismo en tiempo
de ejecución, funciones virtuales, sobrecarga - sobrecarga de funciones, sobrecarga de operadores.
Unidad-V
Plantillas y gestión de excepciones:
Introducción a las Plantillas, Plantillas de Clases, Plantillas de Clases con Múltiples Parámetros,
Plantillas de Funciones, Plantillas de Funciones con Múltiples Parámetros.
Gestión de excepciones:
Fundamentos del manejo de excepciones, tipos de excepciones, mecanismo de manejo de
excepciones, mecanismo de lanzamiento y captura, relanzamiento de una excepción, especificación
de excepciones.
Resultados:
• Diferenciar la programación orientada a objetos de la programación procedimental.
• Construir clases, funciones y objetos
• Para implementar los constructores, destructores y la herencia
• Desarrollar programas utilizando técnicas de gestión dinámica de la memoria
• Aplicar el tratamiento de excepciones y la programación genérica.
Libros de texto:
1. Programación orientada a objetos con C++ por Balagurusamy
2. C++, the Complete Reference,4ª edición, Herbert Schildt, TMH.
Referencias:
1. C++ Primer,3.ª edición, S.B.Lippman y J.Lajoie, Pearson Education.
2. El lenguaje de programación C++,3ª edición, B.Stroutstrup, Pearson Educ.
UNIDAD -1
Abstracción de datos :
La abstracción se refiere al acto de representar características esenciales sin incluir los detalles
de fondo o la explicación. Las clases utilizan el concepto de abstracción y se definen como una lista de atributos
como tamaño, peso, coste y funciones para operar sobre estos atributos. Encapsulan todas las propiedades
esenciales del objeto que se va a crear. Los atributos se denominan miembros de datos, ya que contienen datos, y
las funciones que operan con estos datos se denominan funciones miembro.
Las clases utilizan el concepto de abstracción de datos por lo que se denominan tipos de datos abstractos
(ADT)
Polimorfismo: Polimorfismo proviene de las palabras griegas "poli" y "morfismo". "poly" significa muchos y
"morfismo" significa forma, es decir, muchas formas. Polimorfismo significa la capacidad de adoptar más de una
forma. Por ejemplo, una operación tiene un comportamiento diferente en distintas instancias. El comportamiento
depende del tipo de datos utilizados en la operación.
Diferentes formas de conseguir polimorfismo en un programa C++:
1) Sobrecarga de funciones 2) Sobrecarga de operadores
#include<iostream>
utilizando el espacio de nombres
std; int main() {inta=4; a=a<<2;
cout<<"a="<<a<<endl;
Devuelve 0;
}
Herencia: La herencia es el proceso por el cual un objeto puede adquirir las propiedades de otro.
La herencia es el concepto más prometedor de la programación orientada a objetos, que ayuda a hacer realidad el
objetivo de construir software a partir de partes reutilizables, en lugar de codificar a mano cada sistema desde
cero. La herencia no sólo favorece la reutilización entre sistemas, sino que también facilita directamente la
extensibilidad dentro de un sistema. La herencia, junto con el polimorfismo y la vinculación dinámica, minimiza
la cantidad de código existente que hay que modificar mientras se mejora un sistema.
Cuando la clase hija hereda la clase padre, la clase hija se denomina clase derivada (subclase) y la clase
padre, clase base (superclase). En este caso, la clase hijo tiene dos partes: una parte derivada y una parte
incremental. La parte derivada se hereda de la clase padre. La parte incremental es el nuevo código escrito
específicamente para la clase hijo.
Encuadernación dinámica:
La vinculación se refiere a la vinculación de la llamada al procedimiento con el código que se ejecutará en
respuesta a la llamada. La vinculación dinámica (o vinculación tardía) significa que el código asociado a una
llamada a un procedimiento determinado no se conoce hasta el momento de la llamada en tiempo de ejecución.
Paso de mensajes:
Un programa orientado a objetos consiste en un conjunto de objetos que se comunican entre sí.
Los objetos se comunican entre sí enviando y recibiendo información .
Un mensaje para un objeto es una solicitud de ejecución de un procedimiento y por lo tanto invocar la
función que se llama para un objeto y genera resultado
ESTRUCTURA BÁSICA DEL LENGUAJE C++ : El programa escrito en lenguaje C++ sigue esta estructura
básica. La secuencia de las secciones debe ser la misma que en la estructura básica. Un programa en C debe tener
una o varias secciones, pero hay que seguir la secuencia de las secciones.
1. Sección de documentación
2. Sección de enlaces
3. Sección de definición
4. Sección de declaración global y declaraciones de clase
5. Definición de la función miembro
6. Función principal
section main() {
Sección de declaración Sección ejecutable
1. SECCIÓN DE DOCUMENTACIÓN : viene en primer lugar y se utiliza para documentar el uso de
la lógica o las razones en su programa. Se puede utilizar para escribir el objetivo del programa, el desarrollador y
los detalles lógicos. La documentación se realiza en lenguaje C con /* y */ . Lo que se escribe entre estos dos se
llama comentario.
2. SECCIÓN DE VINCULACIÓN : Esta sección indica al compilador que vincule
determinadas apariciones de palabras clave o funciones de su programa con los archivos de cabecera
especificados en esta sección.
por ejemplo, #include<iostream>
using namespace std;
hace que el preprocesador añada el contenido del archivo iostream al programa. Contiene declaraciones para cout y cin.
>
cout es un objeto predefinido que representa el flujo de salida estándar. El operador << es un
operador de inserción, hace que la cadena entre comillas dobles aparezca en la pantalla.
La sentencia cin>>n; es una sentencia de entrada y hace que el programa espere a que el usuario teclee un
número. El número tecleado se coloca en la variable "n". El identificador cin es un objeto predefinido en C++ que
corresponde al flujo de entrada estándar. El operador >> se conoce como operador de extracción. Extrae el valor
del teclado y lo asigna a la variable de valor situada a su derecha.
Por ejemplo
void display()
{
cout<<"C++ es mejor que C";
}
SIMPLE PROGRAMA "C++":
#include<iostream>
using namespace std;
void display()
{
cout<<"C++ es mejor que C";
}
int main()
{
mostrar()
Devuelve 0;
}
6. SECCIÓN DE LA FUNCIÓN PRIN CIPAL : Indica al compilador dónde debe comenzar la ejecución
desde main()
{
punto de inicio de la ejecución
}
La función principal tiene dos secciones
1. sección de declaración : En ella se declaran las variables y sus tipos de datos.
2. Sección ejecutable o sección de instrucciones : Tiene la parte del programa que realmente realiza la
tarea que necesitamos.
espacio de nombres:
se utiliza para definir un ámbito que podría contener identificadores globales.
ex:-ámbito del espacio de nombres para la biblioteca estándar de c++.
Las clases, funciones y plantillas se declaran en el espacio de nombres denominado
std using namespace std;-->se puede utilizar la directiva.
espacio_nombre_del_nombre
{
//declaraciones de variables.funciones,clases etc...
}
ex:
#include<iostream>
using namespace std;
espacio de nombres sample
{`
int m;
void display(int n)
{
cout<<"en el espacio de nombres
} N="<<n<<<endl;
}
#include<iostream>
Esta directiva hace que el preprocesador añada el contenido del archivo iostream al programa. algunas
versiones antiguas de C++ usaban iostream.h .si el compilador no soporta ANSI (american nation
standard institute) C++ entonces usa el archivo de cabecera iostream.h
TIPOS DE DATOS:
Un tipo de datos se utiliza para indicar el tipo de valor de datos almacenado en una variable. Todos los
compiladores de C admiten diversos tipos de datos. Esta variedad de tipos de datos permite al
programador seleccionar el tipo adecuado a las necesidades tanto de la aplicación como de la máquina.
ANSI C admite las siguientes clases de datos
, । । .......
Bit con signo Magnitud
MSB(bit más significativo)
100(10)=00000000001100100(2)
Representación de un número negativo :
-100(10)=1111111110011100(2)
Enteros sin signo: Los enteros sin signo utilizan los 16 bits para almacenar la magnitud. Almacena los números
no tiene ningún signo & Calificador de tamaño y rango de tipo de datos entero en una máquina de 16 bits y se
muestran en la tabla:
MEMORIA NECESARIA
GAMA ESPECIFIC
O TAMAÑO DE
TIPO DE DATOS ALMACENAMIENTO EN BYTES ADOR DE
TURBO C GCC/ TURBO C ( 16 BITS) CCG FORMATO
( 16 BITS) COMPILADORES (32 BIT)
EN LINUX (32 BITS)
int corto
-32768
o 2 2 A 32767 %hd
-32768
int corto con signo A 32767 (-2 a +2 -1) (-2 a +2 -1)
int corto
0 a 65535 (0 a +2 -1) 0 a 65535 (0 a +2 -1)
o int corto
con signo 2 2 %hu
-2.147.843.648 a
2 4
-32768 2.147.843.647 (-2 a +2
int con signo o int %d o %i
A 32767 (-2 a +2 -1) -1)
unsigned int 0 a 65535 0 a 4.294.967.295 (0 a2 -1 )
2 4 (0 a +2 -1) %u
long int o signed
long int -2.147.843.648 a -2.147.843.648 a
4 4 2,147,843,647 2,147,843,647 %ld
31 31
(-2 a +2 -1) (-2 a +2 -1)
unsigned long int 0 a 4.294.967.295 0 a 4.294.967.295 (0 a2 -1 )
4 4 (0 a2 -1 ) %lu
long long int o -9223372036854775808
firmado largo largo A
No se admite 8 ------- 9223372036854775807 (- %Ld
int
263
a +263-1)
El número en coma flotante representa un número real con 6 dígitos de precisión que ocupa 4 bytes de memoria.
Las variables de coma flotante se declaran mediante la palabra clave float.
El tipo de datos de coma flotante doble ocupa 8 bytes de memoria y proporciona 14 dígitos de precisión. También
se conocen como números de doble precisión. Las variables se declaran mediante la palabra clave double long double
se refiere a un tipo de datos de coma flotante que suele ser más preciso que double precision.
El tamaño y el rango de los tipos de datos de coma flotante se muestran en la tabla:
Tipo de datos Tamaño (memoria) Gama especificador de
(palabra clave) formato
Flotador 32 bits (4 bytes) 3.4E-38t03.4E+38 %f
Doble 64 bits (8 bytes) 1,7E-308 a I,7E +308 %lf
doble largo 80 bits (10 bytes) 3,4E-4932 a 1,1E+4932 Lf
B tipo de datos
ooleanos:-
El tipo de datos booleano o lógico es un tipo de datos que tiene dos valores (normalmente denotados como
verdadero y falso), destinado a representar los valores de verdad de la lógica y el álgebra booleana. Debe su
nombre a George Boole, que definió por primera vez un sistema algebraico de lógica a mediados del siglo XIX.
El tipo de datos booleano es el resultado principal de las sentencias condicionales, que permiten diferentes
acciones y cambian el flujo de control dependiendo de si una condición booleana especificada por el programador
se evalúa como verdadera o falsa.
C99 añadió un tipo booleano (verdadero/falso) que se define en la cabecera <stdbool.h> La variable
booleana se define mediante la palabra clave bool; Ej:
bool b;
donde b es una variable que puede almacenar verdadero (1) o falso (0)
Tipo de vacío
El tipo void no tiene valores. Suele utilizarse para especificar el tipo de retorno de las funciones. Tipo de función que se dice
que es void cuando no devuelve ningún valor a la función que la llama. También se utiliza para declarar un puntero de
propósito general llamado puntero void.
Tipos de datos derivados.
Los tipos de datos derivados son Arrays , punteros y referencias son ejemplos de tipos de datos
derivados.
Tipos de datos definidos por el usuario:
Los tipos de datos definidos por el usuario se denominan tipos de datos definidos por el usuario.
Son estructura, unión, clase y enumeración.
Fichas C
IDENTIFICADORES: Los identificadores son los nombres que reciben los distintos elementos del programa,
como variables, funciones y matrices. Son nombres definidos por el usuario que constan de una secuencia de
letras y dígitos.
Reglas para declarar identificadores:
El primer carácter debe ser un alfabeto o un guión bajo.
> Debe constar únicamente de letras, dígitos y guión bajo.
Los identificadores pueden tener cualquier longitud, pero sólo son significativos los 31 primeros caracteres.
> No debe contener espacios en blanco ni en blanco.
No debemos utilizar palabras clave como identificadores.
> Las mayúsculas y las minúsculas son diferentes.
Ejemplo: ab Ab aB AB se tratan de forma diferente
Ejemplos de identificadores válidos:
a, x, n, num, SUM, fact, grand_total, sum_of_digits, sum1
Nota: Algunos compiladores de C sólo reconocen los 8 primeros caracteres, por lo que son incapaces de
distinguir identificadores con palabras de longitud superior a ocho caracteres.
CONSTANTES:
Las constantes se refieren a valores que no cambian durante la ejecución de un programa.
Las constantes pueden dividirse en dos grandes categorías:
1.Constantes primarias:
a)Constantes numéricas
Constantes enteras.
Punto flotante (real)
b)Constantes de carácter
Constantes de un solo carácter Constantes de cadena
2.Constantes secundarias:
Constantes de enumeración.
Constantes simbólicas.
Matrices, uniones, etc.
Reglas para declarar constantes:
1 No se permiten comas ni espacios en blanco dentro de la constante.
2 La constante puede ir precedida del signo menos (-) si es necesario.
3 El valor de una constante debe estar dentro de los límites mínimos de su tipo de datos especificado.
Constantes enteras: Una constante entera es un número de valor entero. Consiste en una secuencia de dígitos. Las
constantes enteras pueden escribirse en tres sistemas numéricos diferentes:
1 Número entero decimal (base 10).
2 Número entero octal (base 8).
3 Hexadecimal (base 16).
Constante entera decimal: Consta de un conjunto de dígitos, del 0 al 9.
Declaración válida: 0, 124, -56, + 67, 4567 etc.
Declaración no válida: 245 $, 2,34, 34 345, 075.
También es una declaración no válida.
Nota: No se permiten espacios, comas, caracteres ni símbolos especiales entre los dígitos.
La magnitud (valor máximo) de una constante entera puede oscilar entre cero y algún valor máximo que varía de
un ordenador a otro.
Los valores máximos típicos para la mayoría de los ordenadores personales son: (máquinas de 16 bits)
Constante entera decimal: 32767 (215-1)
Constante octal entera: 077777
Constante entera hexadecimal: 0X7FFF
Nota: El valor más grande que se puede almacenar depende de la máquina.
Constantes de coma flotante o constantes reales : Los números con partes fraccionarias se denominan
constantes reales.
Son los números de base 10 que contienen una parte decimal o un exponente (o ambos). Representación: Estos
números pueden representarse en notación decimal o en notación de exponentes (notación científica).
Notación decimal: 1234,56, 75,098, 0,0002, -0,00674 (notaciones válidas)
Exponente o notación científica:
Forma general: Mantisa e exponente
Mantisa: Es un número real expresado en notación decimal o en notación entera.
Exponente: Es un número entero con un signo más (+) o menos (-) opcional.
E o e: La letra que separa la mantisa de la parte decimal.
Ej: (Anotaciones válidas)
3
1.23456E+3(1.23456×10 )
1
7.5098 e+1(7.5098×10 )
-4
2E-4(2×10 )
Estas notaciones exponenciales son útiles para representar números muy grandes o muy grandes.
pequeño. Ej: 0,00000000987 equivale a 9,87e-9
Constantes de caracteres:-
Constantes de un solo carácter: Es el carácter(o cualquier símbolo o dígito) encerrado entre comillas simples.
Ej: "a" "1" "*
Todas las constantes de carácter tienen valores enteros conocidos como valores ASCII
ASCII:- ASCII son las siglas de American Standard Code for Information Interchange. Pronunciado ask-ee, ASCII es un
código para representar caracteres ingleses como números, asignando a cada letra un número del 0 al 255.Los ordenadores
sólo pueden entender números, por lo que un código ASCII es la representación numérica de un carácter como "a" o "@" o
una acción de algún tipo
.A Los códigos SCII representan texto en ordenadores, equipos de comunicaciones y otros dispositivos que utilizan texto. La
mayoría de los sistemas modernos de codificación de caracteres se basan en ASCII, aunque admiten muchos caracteres
adicionales. A continuación se muestra la tabla de caracteres ASCII, que incluye descripciones de los 32 primeros caracteres
no imprimibles.
Constantes de cadena o literales de cadena:
Una constante de cadena es una secuencia de cero o más caracteres entre comillas dobles.
Por ejemplo:
"MRCET" "12345" "*)(&%"
Constantes de secuencias de escape o caracteres de barra invertida
El lenguaje C admite algunos caracteres no imprimibles, así como la barra invertida ( \ ) que se puede expresar
como secuencias de escape. Una secuencia de escape siempre comienza con una barra invertida seguida de uno o
más caracteres especiales.
Por ejemplo, un carácter de nueva línea se representa "\n" o endl
Se utilizan para dar formato a la pantalla de salida, es decir, la secuencia de escape se utiliza en
funciones de salida. A continuación se indican algunas secuencias de escape:
1. OPERADORES ARITMÉTICOS : Todos los operadores aritméticos básicos están presentes en C. operador
Significado
+ añada
- restar
* multiplicar
/ división
% modulo división(resto)
Una operación aritmética en la que sólo intervienen operandos reales (u operandos enteros) se denomina
aritmética real (o aritmética entera). Si una combinación de aritmética y real se denomina aritmética de modo
mixto.
/*Programa en C sobre expresiones aritméticas de números enteros*/
#include<iostraem.h>
void main()
{
int a, b;
cout<"Introduce dos enteros cualesquiera";
cin>>a>>b;
cout<<"a+b"<< a+b;
cout<<"a-b"<< a-b;
cout<<"a*b"<< a*b;
cout<<"a/b"<< a/b;
cout<<"a%b"<< a%b;
}
SALIDA:
a+b=23
a-b=17
a*b=60
a/b=6
a% b=2
> es inferior a
> es mayor que
> = es menor o igual que
> = es mayor o igual que
== es igual a
!= no es igual a
/* Programa en C sobre operadores relacionales*/
#include<iostream.h>
void main()
{
int a,b;
clrscr();
cout<<"Introduce los valores a, b:";
cin>>a>>b;
cout<<"a>b"<< a>b;
cout<<"a>=b"<< a>=b;
cout<<"a<b"<< a<b;
cout<<"a<=b"<< a<=b;
cout<<"a==b"<< a==b;
cout<<"a!=b"<< a!=b;
}
SALIDA:
Introduzca los valores a, b: 5 9
a>b: 0 //falso
a<b: 1 //verdadero
a>=a: 1 //verdadero
a<=b: 1 //verdadero
a==b: 0 //falso
a!=b: 1 //verdadero
3 .OPERADORES LÓGICOS:
Datos lógicos: Un dato se denomina lógico si transmite la idea de verdadero o falso. En C++ utilizamos el tipo de datos int
para representar datos lógicos. Si el valor del dato es cero, se considera falso. Si es distinto de cero (1 o cualquier número
entero distinto de 0) se considera verdadero. C++ dispone de tres operadores lógicos para combinar valores lógicos y crear
nuevos valores lógicos:
SALIDA: 0&&0=0
0&&1=0
1&&0=0
1&&1=1
0||0=0
0||1=1
1||0=1 1||1=1 !0 =1 !1 =0
4 .OPERADOR DE ASIGNACIÓN:
La expresión de asignación evalúa el operando situado a la derecha del operador (=) y coloca su valor en
la variable situada a la izquierda.
Nota: El operando izquierdo de una expresión de asignación debe ser una única variable.
Existen dos formas de asignación:
-Asignación simple
-Asignación compuesta
Asignación simple :
En las expresiones algebraicas encontramos estas expresiones.
Ej: a=5; a=a+1; a=b+1;
Aquí, el operando de la izquierda debe ser una variable pero no una constante. La variable del lado
izquierdo debe poder recibir un valor de la expresión. Si el operando izquierdo no puede recibir un valor y
le asignamos uno, obtenemos un error de compilación.
Asignación de compuestos:
Una asignación compuesta es una notación abreviada para una asignación simple. Requiere que el
operando izquierdo se repita como parte de la expresión derecha. Sintaxis: operador variable+=valor
Ex:
A+=1; equivale a A=A+1;
El operador ++ suma uno a su operando mientras que el operador - - resta uno a su operando. Estos operadores son
operadores unarios y adoptan la siguiente forma:
Operador Descripción
Tanto el operador de incremento como el de decremento
pueden preceder o seguir al operando. --a Preincremento
Aumento/Disminución de Postfix :( a++/a--) a++ Post-incremento
En el incremento (decremento) postfijo el valor se -a Pre-decremento
incrementa (decrementa) en uno. Así, el a++ tiene el a- Post-decrement
mismo efecto que
En la siguiente tabla se muestran algunos de los operadores de asignación abreviados más utilizados :
Declaración con operador de asignación simple Declaración con operador abreviado
a-=1
a=a+l
a=a-l a-=l
a=a*l a*=i
a=a/1 a-1
a=a% 1 a%=l
a=a*(n-l) a*=n+1
5.OPERADORES DE INCREMENTO (++) Y DECREMENTO (--):
a=a+1; a--tiene el mismo efecto que a=a-1.
La diferencia entre a++ y a+1 es que si ++ va después del operando, el incremento se produce después de evaluar la
expresión.
El operando de una expresión postfija debe ser una variable.
Ex1:
int a=5;
B=a++; Aquí el valor de B es 5. el valor de a es 6.
Ex2:
int x=4; y=x--; Aquí el valor de y es 4, el valor de x es 3
Prefijo Aumento/Disminución (++a/ --a)
En el incremento (decremento) del prefijo, el efecto se produce antes de que se evalúe la expresión que contiene el operador.
Es la operación inversa a la postfija. ++a tiene el mismo efecto que a=a+1.
--a tiene el mismo efecto que a=a-1.
Ej: int b=4;
A= ++b;
En este caso el valor de b sería 5 y A sería 5.
Los efectos del incremento postfijo y prefijo son los mismos: la variable se incrementa en
1. Pero se comportan de forma diferente cuando se utilizan en expresiones como las mostradas anteriormente. La ejecución
de estos operadores es rápida en comparación con la sentencia de asignación equivalente.
#include<iostream.h>
int main()
{
int a=1;
int b=5;
++a;
cout<<"a="<<a<<endl;
--b;
cout<<"b="<<b<<endl;
cout<<"a="<<a++<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b--<<endl;
cout<<"b="<<b<<endl;
Devuelve 0;
}
a=2
b=4
a=2
a=3
b=4
b=3
6 .OPERADOR CONDICIONAL U OPERADOR TERNARIO:
#include<iostream.h>
void main()
{
int a, b,c;
cout<<"Introduce los valores a y b:";
cin>>a>>b;
c=a>b?a:b;
cout<<"mayor de a y b es"<<c;
}
Introduzca los valores a y
b:1 5
7 . OPERADORES A NIVEL DE BIT : C soporta operadores especiales conocidos como operadores de bits
para la manipulación de datos a nivel de bits. No se aplican a float ni a double.
operador Significado
Bit del primer operando Bit del segundo operando Opel | Opel
0 0 0
0 1 1
1 0 1
1 1 1
Bit del primer operando Bit del segundo operando Opel A Opel
0 0 0
0 1 1
1 0 1
1 1 0
Operadores de turno
Los operadores de desplazamiento mueven los bits a la derecha o a la izquierda. Son de dos tipos: . -Operador de
desplazamiento de bits a la derecha
. -Operador de desplazamiento bit a bit a la izquierda
Operador bitwise de desplazamiento a la derecha
Es un operador binario que requiere dos operandos integrales. El primer operando es el valor a desplazar y el segundo
especifica el número de bits a desplazar. Cuando los bits se desplazan a la derecha, se eliminan los bits del extremo
derecho y se inserta un cero en el bit MSB.
#include<iostream.h>
void main()
{
int x,shift;
cout<<"Introduce un número:");
cin>>x;
cout<<"introduce ahora muchas veces para desplazar a la derecha: ";
cin>>desplazamiento;
cout<<"Antes del desplazamiento a la derecha:"<<x;
x=x>>desplazamiento;
cout<<"Después del desplazamiento a la derecha:"<<x;
}
Corre1:
Introduzca un número:8
introducir ahora muchas veces a la derecha shift:1
Antes del cambio a la derecha:8
Después del cambio a la derecha:4
El operador de desplazamiento a la derecha divide el número dado por una potencia de 2. Si desplazamos un
número binario dos posiciones hacia la derecha, estamos dividiendo el número dado por 4 (2').
Es un operador binario que requiere dos operandos integrales. El primer operando es el valor a desplazar y
el segundo especifica el número de bits a desplazar a la izquierda.
Cuando los bits se desplazan hacia la izquierda, se borran los bits del extremo izquierdo.
El NOT o complemento a nivel de bit es una operación unaria que realiza la negación lógica de cada bit.
formando el complemento a unos del valor binario dado. Las cifras que eran 0 se convierten en I, y viceversa.
Ex: NOT 0111 (decimal 7) = 1000 (decimal 8)
En C, el operador bitwise NOT es (tilde). Tabla de verdad:
Valor de expresión ~ Expression
0 1
1 (distinto de cero) 0
Nota: El operador de complemento a uno (Bitwise NOT) es diferente del operador Logical NOT. Utilizamos
este operador en los procesos de codificación y descodificación.
8.5 OPERADORES ESPECIALES
Estos operadores que no encajan en ninguna de las clasificaciones anteriores son ,(coma), sizeof, operadores de
puntero(& y *) y operadores de selección de miembros (. y ->). El operador coma se utiliza para unir expresiones
relacionadas.
El tamaño del operador:
Devuelve el número de bytes ocupados por el operando. El operando puede ser una variable, una constante
(valor de datos) o un calificador de tipo de datos.
Ej: int a. c, f, d;
c=sizeof(a); aquí c=2,el operador sizeof devuelve el tamaño de la variable a que es de tipo int f=sizeof(long
double); el valor de f es 10 que es el tamaño del calificador de tipo long double d=sizeof(23.345); el valor de d
es 4 que es el tamaño del valor de la constante float
El operador sizeof se utiliza normalmente para determinar la longitud de matrices y estructuras. También se
utiliza para asignar espacio dinámicamente a la variable s durante la ejecución de un programa.
El operador coma se puede utilizar para vincular el expreso relacionado de expresiones se evalúa de izquierda
a derecha y el valor de la de la expresión combinada.
Ej: a=(x=10, y=20, x+y);
Operadores en c++: Todos los operadores anteriores del lenguaje c también son válidos en c++.Los nuevos
operadores introducidos en c++ son
Manipuladores:
Los manipuladores son los operadores utilizados para dar formato a los datos que se van a mostrar en
pantalla.Los manipuladores más utilizados son endl y setw
endl:-se utiliza en la sentencia de salida e inserta un salto de línea. Es similar al carácter de nueva línea ("\
n")
ej: cout<<"a=2"<<endl;
cout<"nombre=sunil"<<endl;
Salida:
a=2
name=sunil
setw:-
este manipulador permite especificar la anchura de un campo que se va a imprimir en pantalla
Esta función está disponible en el fichero de cabecera iomanip.h
#include<iostream.h>
#include<iomanip.h>
using namespace std;
int main()
{
int s=123;
cout<<"s="<<setw(10)<<s ;
}
salida
s= 123
Operadores de inserción (<<) y extracción (>>):
los operadores se utilizan con objetos de salida y de entrada
ex:
cout<<"Introduce n";
cin>>n
1.51 Ejemplo de sentencia if: si la expresión de prueba es verdadera, la sentencia if ejecuta las sentencias que
siguen inmediatamente a if
Sintaxis:
If(expresión de prueba)
Lista de declaraciones;
#include<iostream.h>
int main()
{
int a,b;
cout<<"Introduce dos enteros cualesquiera:";
cin>>a>>b;
if(a>b) cout<<"A es mayor que B\n A="<<a;
3 Anidamiento de sentencias if-elseTambién esposible anidar una sentencia if dentro de otra. cuandohay que tomar una serie de
decisiones.
Sentencia if -else colocada dentro de otra sentencia if else Sintaxis:
If(expresión de prueba ) {If(expresión
de prueba) { //declaraciones } else
{ //declaraciones } } else
{If(expresión de prueba) {
//declaraciones } else {
//declaraciones }
} /*mayor de tres números*/
#include<iostream.h>
#include<conio.h> int main() { int a,b,c;
cout<<"Introduce los valores a,b,c:";
cin>>a>>b>>c;
if(a>b) {
if(a>c) {
cout<<"A ia
mayor entre
tres números\
n"; cout
"A="<<a;
} else {
cout<<"C ia
mayor entre
tres números\n"; cout<<"c="<<c;
} } else {if(b>c) {
cout<<"B ia mayor entre tres números\n"; cout<<"B="<<b;
}
si no
{
cout<<"C ia mayor entre tres números\n";
cout<<"c="<<c;
}
}
getch();
Devuelve 0;
}
4.1 f si no escalera
si(condición1)
declaración1;
else if(condición2)
enunciado 2;
else if(condición3)
declaración n;
si no
declaración por defecto.
declaración-x;
El anidamiento de if-else depende de las condiciones con las que tengamos que tratar.
La condición se evalúa de arriba a abajo.Si una condición es verdadera se ejecuta la sentencia asociada a ella.
Cuando todas las condiciones sean falsas, se ejecutará la parte final else que contiene las sentencias por defecto.
#include<iostream.h>
void main()
{
int per;
cout<<"Introducir
porcentaje"; cin>>per;
si(per>=80)
cout<<"Asegurado
Distinción"<<endl; else if(per>=60)
cout<<"Asegurado Primero
División"<<endl; else if(per>=50)
cout<<"Asegurado
Segunda División"<<endl;
else if(per>=40)
cout<<"Asegurado
División"<<endl; Terce
si no ra
cout<<"Fallo"<<endl
por defecto:
bloque por defecto;
1 .SENTENCIA WHILE :
While(condición de prueba)
{
cuerpo del bucle
}
Se trata de un bucle controlado por entrada. La condición se evalúa
y si es verdadera entonces se ejecuta el cuerpo del bucle. Después de la
ejecución del cuerpo la condición se evalúa una vez más y si es verdadera el
cuerpo se ejecuta una vez más. Esto continúa hasta que la condición de
prueba se convierte en falsa.
do
{
cuerpo
}while(condición de prueba);
do{
suma = suma + i;
i = i + 1;
} while(i<=n);
cout<<"Suma de los primeros"<< n<<" números naturales.
es:"<<suma; return 0;
}
Nota: si la condición de prueba es falsa antes de que se ejecute el bucle, el bucle While se ejecutará cero veces, mientras
que el bucle do--while se ejecutará una vez.
3.FOR LOOP : También es un bucle de control de entrada que proporciona una estructura
más concisa
Sintaxis:
for(inicialización; expresión de prueba; incremento/decremento) {
declaraciones;
}
El enunciado For se divide en tres expresiones, cada una de
ellas separada por dos puntos y coma;
1.la expresión de inicialización se utiliza para inicializar
variables
2.expresión de prueba es responsable de continuar el bucle.
Si es verdadera, el flujo de control del programa entra en el
bucle y ejecuta el bloque de sentencias asociado a él. Si la
expresión de prueba es falsa, el bucle termina. 3. La
expresión de incremento/decremento consiste en un operador
de incremento o decremento. Este proceso continúa hasta que
se satisface la condición de prueba.
for(i=1;i<=n;i++)
{
suma = suma + i;
}
Bucles anidados:Escribir una sentencia de control de bucle dentro de otra sentencia de control de bucle se
denomina sentencia de bucle anidado
Ex:
for(i=1;i<=10;i++)
for(j=1;j<=10;j++) cout<<i<<j;
cout<<i<<"\t";
}
getch( );
}
Salida:
Introduzca el número : 5
2 35
etiqueta:
declaració Ir a la
n; etiqueta;
Salto hacia delante Salto hacia atrás
La etiqueta: puede estar en cualquier parte del programa, ya sea antes o después de la etiqueta goto;
declaración.
Si la etiqueta: se coloca después de la etiqueta goto;, algunas sentencias se saltarán y el salto se conoce como
Salto hacia adelante.
Si la etiqueta: se coloca antes de la etiqueta goto; se formará un bucle algunas sentencias se ejecutarán
repetidamente. Un salto de este tipo se conoce como salto hacia atrás.
Continue:Se utiliza para continuar la iteración de la sentencia del bucle saltándose las
sentencias posteriores a la sentencia continue. Hace que el control pase directamente a la
condición de prueba y luego continúe el bucle.
/*c programa para hallar la suma de n números positivos leídos del teclado*/
#include<stdio.h>
int main()
{
int i ,suma = 0,n,número;
cout<<Introduzca N";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Introduce un número:";
cin>>número;
if(number<0) continuar;
suma = suma + número;
}
cout<<"La suma de"<<n<<" números es:"<<suma;
Devuelve 0;
}
UNIDAD -2
Presentación de la clase:
La programación orientada a objetos es una colección de objetos y cada objeto consta de las
correspondientes estructuras de datos y procedimientos. El programa es reutilizable y más fácil de mantener.
El aspecto importante en oop es una clase que tiene una sintaxis similar a la de estructura.
clase: Es una colección de datos y funciones miembro que manipulan datos. Los componentes de datos de la
clase se denominan miembros de datos y las funciones que manipulan los datos se denominan funciones
miembro.
También se le puede llamar blue print o prototipo que define las variables y funciones comunes a todos
los objetos de cierto tipo. También se conoce como tipo de datos definido por el usuario o ADT (tipo de datos
abstracto) Una clase se declara mediante la palabra clave class.
Sintaxis:-
clase nombre_clase {
Especificador de acceso :
Declaraciones de variables;
Especificador de acceso :
declaraciones de funciones;
};
Control de acceso:
Los especificadores de acceso o modificadores de acceso son las etiquetas que especifican el tipo de
acceso dado a los miembros de una clase. Se utilizan para ocultar datos. También se denominan modos de
visibilidad. Existen tres tipos de especificadores de acceso
1.privado
2.público
3.protegido
1.Privado:
Si los miembros de datos se declaran como de acceso privado, entonces no se puede acceder a ellos
desde otras funciones fuera de la clase. Sólo se puede acceder a ella mediante las funciones declaradas dentro de
la clase. Se declara mediante la palabra clave "private" .
2.público:
Si los miembros de datos se declaran de acceso público, entonces se puede acceder a ellos desde otras
funciones fuera de la clase. Se declara mediante la palabra clave "public" .
3.protected: El nivel de acceso de la declaración protegida se sitúa entre público y privado. Este especificador
de acceso se utiliza en el momento de la herencia
Nota:-
Si no se especifica ningún especificador de acceso, se trata por defecto como privado
El especificador de acceso por defecto de una estructura es "public", mientras que el de una clase es "private".
Ejemplo:
alumno de clase
{
privado : int roll;
char nombre[30];
público:
void obtener_datos()
{
cout<<"Introducir número de rollo y nombre": cin>>rollo>>nombre;
}
void poner_datos()
{
cout<<"Número de rollo:"<<rollo<<<endl;
cout<<"Nombre :"<<nombre<<endl;
}
};
Objeto:-La instancia de una clase se denomina objeto.
Sintaxis:
nombre_clase nombre_objeto;
Ex:
estudiante s;
Acceso a los miembros: el operador -dot se utiliza para acceder a los miembros de la clase
Nombre-objeto.nombre-función(argumentos reales);
Ex:
s.get_data();
s.put_data();
Nota:
1 Si no se especifica el especificador de acceso en la clase, el especificador de acceso por defecto es
private
2 Todas las funciones miembro deben ser declaradas como públicas, si no, no son accesibles fuera de
la clase. Objeto:
La instancia de una clase se denomina objeto.
Sintaxis:
Nombre_clase nombre_objeto;
Por ejemplo:
estudiante s;
en el ejemplo anterior s es el objeto. Es una entidad en tiempo real que puede utilizarse
Escribir un programa para leer los datos de un alumno
#include<iostream>
using namespace std;
alumno de clase
{
privado:
int roll;
char nombre[20];
público:
void getdata()
{cout<<"Introduzca el número de rollo:";
cin>>roll;
cout<<"Introduce el nombre:";
cin>>nombre;
}
void putdata()
{cout<<"Rollo no:"<<rollo<<<endl;
cout<<Nombre:"<<nombre<<endl;
}
};
int main()
{
estudiante s;
s.getdata();
s.putdata();
returm 0;
}
Ámbito Resolución operador:
Ámbito:-La visibilidado disponibilidad de una variable en un programa se denomina ámbito.
Existen dos tipos de ámbito. i)Ámbito local ii)Ámbito global
Ámbito local: la visibilidad de una variable es local a la función en la que se declara.
Ámbito global: visibilidad de una variable para todas las funciones de un programa.
Operador de resolución de alcance en "::" .
Se utiliza para acceder a variables globales si se declaran las mismas variables como locales y
globales
#include<iostream.h>
int a=5;
void main()
{
int a=1;
cout<<"Local a="<<a<<endl;
cout<<"Global a="<<::a<<<endl;
}
Ámbito de la clase:
El operador de resolución de ámbito(::) se utiliza para definir una función fuera de una clase.
#include <iostream>
using namespace std;
muestra de clase
{
público:
void output(); //declaración de función
};
// definición de la función fuera del
class void muestra::salida() {
cout << "Función definida fuera de la clase.\n";
};
int main() {
muestra obj;
obj.output();
Devuelve 0;
}
Salida del programa:
Función definida fuera de la clase.
void rectángulo::obtener_datos()
{
cout<<"Introduce la longitud del rectángulo";
cin>>L;
cout<<"Introduce la anchura del rectángulo";
cin>>B;
}
int rectángulo::área()
{
devuelve L*B;
}
int main()
{
rectángulo r;
r.get_data();
cout<<"El área del rectángulo es"<<r.area();
Devuelve 0;
}
FUNCIONES EN LÍNEA:
Definición:
Una función inline es una función que se expande en línea cuando es invocada. La expansión en línea
hace que un programa se ejecute más rápido porque se elimina la sobrecarga de una llamada y retorno
de función. Se define utilizando la palabra clave " inline".
Sintaxis:
Nombre de la clase de tipo de datos::static_variable Nombre;
Ej: int item::count;
#include<iostream.h>
#include<conio.h>
elemento de clase
{
static int count;
número int;
público:
void getdata(int a) {
number=a; count++;
}
void getcount()
{
cout<<"cuenta es"<<cuenta;
}
};
int item::count;//decleración
int main()
{
punto a,b,c;
a.getcount();
b.getcount();
c.getcount();
a.getdata(100);
b.getdata(200);
c.getdata(300);
cout<<"Después de leer los datos";
a.getcount();
b.getcount();
c.getcount();
Devuelve 0;
}
Salida:
el recuento es 0
el recuento es 0
el recuento es 0
Después de leer los datos
la cuenta es 3
la cuenta es 3
la cuenta es 3
Funciones estáticas
Al igual que las variables miembro estáticas, también podemos tener funciones miembro estáticas. Una
función miembro declarada estática tiene las siguientes propiedades:
Una función estática sólo puede tener acceso a otros miembros estáticos (funciones o variables)
declarados en la misma clase.
Una función miembro estática debe llamarse utilizando el nombre de la clase (en lugar de sus objetos)
de la siguiente forma: nombre-clase :: nombre-función;
#include<iostream.h>
prueba de clase
{
código int;
static int count;
público:
void setcode()
{
code=++cuenta;
}
void showcode()
{
cout<<"número de objeto"<<código;
}
static void showcount()
{
cout<<"cuenta"<<cuenta;
}
};
int prueba::cuenta;
int main()
{
prueba t1,t2;
t1.setcode();
t2.setcode();
test::showcount();
prueba t3;
t3.setcode();
test::showcount();
t1.showcode();
t2.showcode();
t3.showcode();
Devuelve 0;
}
Salida:
recuento 2
recuento 3
objeto número 1
objeto número 2
objeto número 3
Matrices de objetos: Las matrices de variables de tipo "clase" se conocen como "Matriz de objetos". Un array
de objetos se almacena dentro de la memoria de la misma forma que un array ordinario.
Sintaxis:
clase nombre_clase
{
privado:
miembros de data_type;
público:
miembros data_type; funciones miembro;
};
Matriz de objetos:
Nombre_clase nombre_objeto[tamaño];
Donde tamaño es el tamaño de la matriz
Ex:
Myclass obj[10];
Escribe un programa para inicializar un array de objetos e imprimirlos
#include<iostream>
using namespace std;
clase MyClass
{
int a;
público:
void set(int x)
{
a=x;
}
int obtener()
{
devolver a;
}
};
int main()
{
MyClass obj[5];
for(int i=0;i<5;i++)
obj[i].set(i);
for(int i=0;i<5;i++)
cout<<"obj["<<i<<"].get():"<<obj[i].get()<<endl;
}
Salida:
obj[0].get():0
obj[1].get():1
obj[2].get():2
obj[3].get():3
obj[4].get():4
Objetos como argumentos de funciones: Los objetos pueden utilizarse como argumentos de
funciones Esto puede hacerse de tres maneras
a. Pasar por valor o llamar por valor
b. Pasar por dirección o llamar por dirección
c. Pasar por referencia o llamar por referencia
a.Pass-by-value - Una copia del objeto (objeto real) se envía a la función y se asigna al objeto de la función
llamada (objeto formal). Tanto las copias reales como las formales de los objetos se almacenan en distintas
posiciones de memoria. Por lo tanto, los cambios realizados en el objeto formal no se reflejan en el objeto real.
escriba un programa para intercambiar los valores de dos objetos
escribir un programa para intercambiar los valores de dos objetos
#include<iostream.h>
using namespace std;
clase muestra2;
clase muestra1
{
int a;
público:
void getdata(int x);
friend void display(muestra1 x,muestra2 y);
friend void swap(muestra1 x,muestra2 y);
};
void muestra1::getdata(int x)
{
a=x;
}
clase muestra2
{
int b;
público:
void getdata(int x);
friend void display(muestra1 x,muestra2 y);
};
void muestra1::getdata(int x)
{
a=x;
}
clase muestra2
{
int b;
público:
void getdata(int x);
friend void display(muestra1 x,muestra2 y);
friend void swap(muestra1 *x,muestra2 *y);
};
void muestra2::getdata(int x)
{
b=x;
}
void display(muestra1 x,muestra2 y)
{
cout<<"Los datos del objeto 1 son"<<endl;
cout<<"a="<<x.a<<<endl;
cout<<"Los datos del objeto 2 son"<<endl;
cout<<"b="<<y.b<<<endl;
}
void swap(muestra1 *x,muestra2 *y)
{
int t;
t=x->a;
x->a=y->b;
y->b=t;
}
int main()
{
muestra1 obj1;
muestra2 obj2;
obj1.getdata(5);
obj2.getdata(15);
cout<<"Antes de Intercambiar datos entre Dos objetos\n ";
display(obj1,obj2);
swap(&obj1,&obj2);
cout<<"tras Intercambio de datos entre Dos objetos\n ";
display(obj1,obj2);
}
Antes del intercambio de datos entre dos objetos
Los datos del objeto 1 son a=5
Los datos del objeto 2 son b=15
tras el intercambio de datos entre dos objetos
Los datos del objeto 1 son a=15
Los datos del objeto 2 son b=5 c.Pass-by-reference:Se envía una referencia de objeto como argumento a la
función.
La referencia a una variable proporciona un nombre alternativo para una variable previamente definida. Si se
realiza algún cambio en la variable de referencia, se produce un cambio en la variable original.
Una variable de referencia puede declararse del siguiente modo
int x=5;
int &y=x;
Ex:
Escribe un programa para encontrar la suma de n números naturales usando la variable de referencia
#include<iostream.h>
using namespace std;
int main()
{
int i=0;
int &j=i;
int s=0;
int n;
cout<<"Introduce n:";
cin>>n;
while(j<=n)
{
s=s+i;
i++;
}
cout<<"suma="<<s<<endl;
}
Salida:
Introduzca n:10
suma=55
escribe un programa para intercambiar los valores de dos objetos
#include<iostream.h>
using namespace std;
clase muestra2;
clase muestra1
{
int a;
público:
void getdata(int x);
friend void display(muestra1 x,muestra2 y);
friend void swap(muestra1 &x,muestra2 &y);
};
void muestra1::getdata(int x)
{
a=x;
}
clase muestra2
{
int b;
público:
void getdata(int x);
friend void display(muestra1 x,muestra2 y);
friend void swap(muestra1 &x,muestra2 &y);
};
void muestra2::getdata(int x)
{
b=x;
}
void display(muestra1 x,muestra2 y)
{
cout<<"Los datos del objeto 1 son"<<endl;
cout<<"a="<<x.a<<<endl;
cout<<"Los datos del objeto 2 son"<<endl;
cout<<"b="<<y.b<<<endl;
}
void swap(muestra1 &x,muestra2 &y)
{
int t;
t=x.a;
x.a=y.b;
y.b=t;
}
int main()
{
muestra1 obj1;
muestra2 obj2;
obj1.getdata(5);
obj2.getdata(15);
cout<<"Antes de Intercambiar datos entre Dos objetos\n ";
display(obj1,obj2);
swap(obj1,obj2);
cout<<"tras Intercambio de datos entre Dos objetos\n ";
display(obj1,obj2);
}
Salida:
Antes del intercambio de datos entre dos objetos
Los datos del objeto 1 son a=5
Los datos del objeto 2 son b=15
tras el intercambio de datos entre dos objetos
Los datos del objeto 1 son a=15
Los datos del objeto 2 son b=5
FUNCIONES AMIGAS:Los miembros privados no pueden ser accedidos desde fuera de la clase. i.e....
una función no miembro no puede tener acceso a los datos privados de una clase. En C++ una función no
miembro puede acceder a private haciendo que la función sea amiga de una clase.
Definición:
Una función amiga es una función que se declara dentro de una clase y se define fuera de ella. No
requiere ningún operador de resolución de ámbito para definir . Puede acceder a los miembros privados de una
clase. Se declara utilizando la palabra clave "friend".
Ex:
muestra de clase
{ int x,y; public: muestra(int a,int b);
friend int suma(muestra s);
};
muestra::muestra(int a,int b)
{ x=a;y=b;
}
int suma(muestras s)
{ int suma;
suma=s.x+s.y;
Devuelve 0;
}
void main()
{
Muestra obj(2,3);
int res=suma(obj);
cout<< "suma="<<res<<endl;
}
Una función amiga posee ciertas características especiales:
No está en el ámbito de la clase a la que se ha declarado como amigo.
Como no está en el ámbito de la clase, no puede ser llamado utilizando el objeto de esa clase. Puede invocarse como una
función normal sin ayuda de ningún objeto.
A diferencia de las funciones de miembro, no puede acceder directamente a los nombres de los miembros y tiene que utilizar un
nombre de objeto y un operador de pertenencia de punto con cada nombre de miembro.
Puede declararse en la parte pública o privada de una clase sin que ello afecte a su significado.
Normalmente, tiene los objetos como argumentos.
#include<iostream.h> class sample
{
int a;
int b;
público:
void setvalue()
{
a=25;
b=40;
}
amigo float media(muestra s);
};
float media(muestra s)
{
return float(s.a+s.b)/2.0;
}
int main()
{
muestra X;
X.setvalue();
cout<<"Valor medio="<<media(X);
Devuelve 0;
}
escribe un programa para encontrar el maximo de dos numeros usando una funcion amiga para dos
clases diferentes #include<iostream>
using namespace std;
clase muestra2;
clase muestra1
{
int x;
público:
muestra1(int a);
friend void max(muestra1 s1,muestra2 s2)
};
muestra1::muestra1(int a)
{
x=a;
}
clase muestra2
{
int y;
público:
muestra2(int b);
friend void max(muestra1 s1,muestra2 s2)
};
Muestra2::muestra2(int b)
{
y=b;
}
void max(muestra1 s1,muestra2 s2)
{
Si(s1.x>s2.y)
cout<<"Miembro de datos en Objeto de la clase muestra1 es mayor"<<endl;
si no
cout<<"Miembro de datos en Objeto de la clase muestra2 es mayor"<<endl;
}
void main()
{
muestra1 obj1(3);
muestra2 obj2(5);
max(obj1,obj2);
}
#include<iostream>
using namespace std;
clase compleja
{
float real,img;
público:
complejo();
complex(float x,float y)
friend complejo add_complex(complejo c1,complejo c2);
};
complejo::complejo()
{
real=img=0;
}
complex::complex(float x,float y)
{
real=x;img=y;
}
complejo add_complex(complejo c1,complejo c2)
{
complejo t;
t.real=c1.real+c2.real;
t.img=c1.img+c2.img;
devolver t;
}
void complejo::mostrar ()
{
if(img<0)
{img=-img;
cout<<real<<"-i"<<img<<<endl
} else { cout<<real<<"+i"<<img<<<endl
}
}
int main()
{
complejo obj1(2,3);
complejo obj2(-4,-6);
complejo obj3=add_compex(obj1,obj2);
obj3.display();
Devuelve 0;
}
Clase amiga:Una clase también puede declararse amiga de otra clase. Cuando creamos una clase amiga,
todas las funciones miembro de la clase amiga también se convierten en amigas de la otra clase. Esto requiere la
condición de que la clase que se convierte en amigo debe ser declarada o definida en primer lugar (declaración
hacia adelante).
#include <iostream.h>
clase muestra_1
{
clase amiga muestra_2;//declarar clase amiga
int a,b;
público:
void getdata_1()
{
cout<<"Introduce los valores A y B en la clase muestra_1";
cin>>a>>b;
}
void display_1()
{
cout<<"A="<<a<<endl;
cout<<"B="<<b<<endl;
}
};
clase muestra_2
{
int c,d,suma;
sample_1 obj1;
público:
void getdata_2()
{
obj1.getdata_1();
cout<<"Introduzca los valores C y D en la clase muestra_2"; cin>>c>>d;
}
void suma_2()
{
suma=obj1.a+obj1.b+c+d;
}
void visualizar_2()
{
cout<<"A="<<obj1.a<<<endl;
cout<<"B="<<obj1.b<<<endl;
cout<<"C="<<c<<endl;
cout<<"D="<<d<<endl;
cout<<"SUMA="<<suma<<endl;
}
};
int main()
{
sample_1 s1;
s1.getdata_1();
s1.display_1();
muestra_2 s2;
s2.getdata_2();
s2.suma_2();
s2.display_2();
}
integer obj1; => no sólo crea el objeto obj1 sino que también inicializa sus datos m y n a cero. No es necesario
escribir ninguna sentencia para invocar la función constructora.
CARACTERÍSTICAS DEL CONSTRUCTOR
> Deben declararse en la sección pública.
Se invocan automáticamente cuando se crean los objetos.
> No tienen tipo de retorno, ni siquiera void.
No se pueden heredar, aunque una clase derivada puede llamar al constructor de la
clase base.
> Como otras funciones c++, pueden tener argumentos por defecto.
>
Realizan "llamadas implícitas" a los operadores new y delete cuando es necesario asignar memoria.
Los constructores son de 3 tipos:
1. Constructor por defecto
2. Constructor parametrizado
3. Constructor de copias
1 Constructor por defecto: Un constructor que no acepta parámetros se denomina constructor por defecto.
#include<iostream.h>
#include<conio.h> class item
{
int m,n;
público:
item()
{
m=10;
n=20;
}
void put();
};
void item::put() {
cout<<m<<n;
}
void main()
{
item t;
t.put();
getch();
}
2 Constructores parametrizados:-Los constructores que toman parámetros se llaman
constructores parametrizados.
#include<iostream.h>
elemento de clase
{
int m,n;
público:
item(int x, int y)
{
m=x;
n=y;
}
};
Cuando un constructor ha sido parametrizado, la sentencia de declaración de objeto como item
t; puede no funcionar. Debemos pasar los valores iniciales como argumentos a la función constructora
cuando se declara un objeto. Esto puede hacerse de 2 maneras: item t=item(10,20); //llamada explícita
void put();
};
void item::put()
{
cout<<m<<n;
}
void main()
{
item t1(10,20);
elemento t2=elemento(20,30);
t1.put();
t2.put();
getch();
}
3 .Copy Constructor: Un constructor de copia se utiliza para declarar e inicializar un objeto
a partir de otro objeto.
Ej:
elemento t2(t1);
o
elemento t2=t1;
Múltiples Constructores en una Clase: Se pueden declarar múltiples constructores en una clase. Puede
haber cualquier número de constructores en una clase.
clase compleja
{
float real,img;
público:
complex()//constructor por defecto
{
real=img=0;
}
real=img=r;
}
real=r;img=i;
}
complex(complex&c)//constructor de copia
{
real=c.real;
img=c.img;
}
suma compleja(complejo c ) {
complejo t;
t.real=real+c.real;
t.img=img+c.img;
devolver t;
}
void mostrar()
{
Si(img>0)
cout<<real<<"+i"<<img<<<endl;
si no
{
img=-img;
cout<<real<<"-i"<<img<<<endl;
}
};
void main()
{
complejo c1(1,2);
complejo c2(2,2);
compex c3;
c3=c1.suma(c3);
c3.show();
DESTRUCTORES:Un destructor, se utiliza para destruir los objetos que han sido creados por un constructor.
Al igual que un constructor, el destructor es una función miembro cuyo nombre es el mismo que el de la
clase pero va precedido de una tilde.
Ej: ~item() { }
1. Un destructor nunca toma ningún argumento ni devuelve ningún valor.
2. Será invocado implícitamente por el compilador al salir del programa para limpiar el almacenamiento
que ya no es accesible.
3. Es una buena práctica declarar destructores en un programa ya que libera espacio de memoria para uso
futuro.
#include<iostream>
using namespace std;
clase Marcas
{
público:
int matemáticas;
int science;
//constructor
Marcas() {
cout << "Dentro del Constructor"<<endl;
cout << "Objeto C++ creado"<<endl;
}
//Destructor
~Marks() {
cout << "Dentro del destructor"<<endl;
cout << "Objeto C++ destruido"<<endl;
}
};
int main( )
{
Marcas m1;
Marcas m2;
Devuelve 0;
}
Salida:
Dentro del constructor
Objeto C++ creado
Dentro del constructor
Objeto C++ creado
Destructor interior
Objeto C++ destruido
Destructor interior
Objeto C++ destruido
HERENCIA: . El mecanismo de derivación de una nueva clase a partir de una antigua se denomina
herencia o derivación. La clase antigua se denomina clase base y la nueva, clase derivada o subclase. La
clase derivada hereda algunos o todos los rasgos de la clase base.
Una clase también puede heredar propiedades de más de una clase o de más de un nivel.
Una clase derivada puede definirse especificando su relación con la clase base además de sus propios detalles.
Los dos puntos indican que el nombre de la clase derivada se deriva del nombre de la clase base. el modo de
visibilidad es opcional y, si está presente, puede ser private o protected o public. Por defecto es privado. El
modo de visibilidad especifica si las características de la clase base se derivan de forma privada o pública.
Tipos de herencia: 1. Herencia simple 2. Herencia multinivel 3. Herencia múltiple 4. Herencia híbrida 5.
Herencia múltiple Herencia jerárquica.
1.HERENCIA ÚNICA: una clase derivada hereda de una sola clase base. Es la forma más sencilla de
Herencia.
A / /Clase base
B //Clase derivada
#include<iostream> using namespace std; class A { public: int a,b; void get() { cout<<"Introduzca dos valores
enteros cualesquiera"<<endl; cin>>a>>b;
} };
clase B:public A {
int c;
público:
void add()
{ c=a+b;
cout<<a<<"+"<<b<<"="<<c;
}
};
int main()
{
B b;
b.get();
b.add();
}
Salida:
Introduzca dos valores enteros cualesquiera
12
1+2=3
2.HERENCIA MÚLTIPLE: En este tipo de herencia la clase derivada hereda de una clase, que a su vez
hereda de alguna otra clase. La Superclase para uno, es subclase para el otro.
#include<iostream.h>
clase A
{
público:
int a,b;
void get()
{
cout<<"Introduzca dos valores enteros cualesquiera"<<endl;
cin>>a>>b;
}
};
clase B:public A
{
público:
int c;
void add()
{
c=a+b;
}
};
clase C:public B
{
público:
void mostrar()
{
cout<<a<<"+"<<b<<"="<<c;
}
};
int main()
{
C c;
c.get();
c.add();
c.show();
}
Salida:
Introduzca dos valores enteros cualesquiera
12 14
12+14=26
3 Herencia múltiple:en este tipo de herencia, una única clase derivada puede heredar de dos o más clases
base.
Sintaxis
: clase D : visibilidad A, visibilidad B,.... {
#include<iostream.h>
clase A
{
público:
int a;
void getA()
{
cout<<"Introduzca un valor entero"<<endl; cin>>a;
}
};
clase B
{
público:
int b;
void getB()
{
cout<<"Introduzca un valor entero"<<endl; cin>>b;
}
};
4 Herencia híbrida: La herencia híbrida es la combinación de dos o más herencias, como la herencia
simple, múltiple, multinivel o jerárquica.
#include<iostream.h>
clase aritmética
{
protegida:
int num1, num2;
público:
void getdata()
{
cout<<"Para la adición:";
cout<<"\nIntroduzca el primer número: ";
cin>>num1;
cout<<"\nIntroduzca el segundo número: ";
cin>>num2;
}
};
clase plus:aritmética pública
{
protegida:
int suma;
público:
void add()
{
suma=num1+num2;
}
};
clase menos
{
protegida:
int n1,n2,diff;
público:
void sub()
{
cout<<"\nPara la resta:";
cout<<"\nIntroduzca el primer número: ";
cin>>n1;
cout<<"\nIntroduzca el segundo número: ";
cin>>n2;
diff=n1-n2;
} };
clase resultado:public más, public menos
{
público:
void display()
{
Por adición:
Introduzca el primer número: 1
Para restar:
Introduzca el primer número: 3
Suma de 1 y 2= 3
Diferencia de 3 y 4= -1
5 Herencia Jerárquica:- Heredar es un método de herencia donde una o más clases derivadas derivan de
una clase base común.
Introduzca el número : 3
Un objeto de datos creado dentro de un bloque con new, seguirá existiendo hasta que sea
explícitamente
destruido mediante el uso de eliminar.
nuevo operador:-
El operador new se puede utilizar para crear objetos de cualquier tipo, por lo que asigna
memoria suficiente para contener los datos de los objetos y devuelve la dirección de la memoria
asignada. Sintaxis:
>
Para crear espacio de memoria para matrices: puntero-variable = nuevo tipo-datos[tamaño];
eliminaroperador:
Si la variable o el objeto ya no es necesario o necesario es destruido por el operador "delete", por
lo que una cierta cantidad de memoria se libera para fines futuros. Synatx:
eliminar puntero-variable;
Ej: suprimir p;
>
Si queremos liberar una asignación dinámica
array: borrar [tamaño] puntero-variable;
Programa: escribe un programa para encontrar la suma de una lista de enteros #include<iostream> using
namespace std; int main()
{
int n,*p;
cout<<"Introduce el tamaño del array:";
cin>>n;
p=nuevo int[n];
cout<<"Introducir lista de enteros"<<endl;
for(int i=0;i<n;i++)
cin>>p[i];
//lógica de la suma
int s=0;
for( int i=0;i<n;i++)
s=s+p[i];
cout<<"La suma de los elementos del array es\n";
cout<<s;
suprimir [ ]p;
Devuelve 0;
}
Introduzca el tamaño de la matriz:5
Introducir lista de enteros
1 2345
La suma de los elementos de la matriz es
15
muestra s; //objeto
int muestra ::*p;//declaración de punteros
s.*p=10; //correcto
cout<<s.*p;
}
Punteros a objetos:Los punteros a objetos son útiles para crear objetos en tiempo de ejecución. Para acceder a
los miembros operador de flecha ( ) y el operador de referenciación o indirección (*).
Declaración de puntero.
className*ptr
ex:
item *obj;
Aquí obj es un puntero a objeto de tipo item.
elemento de clase
{
código int;
precio de flotación;
público:
void getdata(int a,float b)
{
code=a;
precio=b;
}
void mostrar()
{
cout<<"código:"<<código<<<"\n"<<"Precio:"<<precio<<<endl;
}
};
b)mediante puntero
ptr->getdata(101,77.7);
ptr->show();
c)Utilizando el operador de referenciación y el operador punto (*ptr).getdata(101,77.7);
(*ptr).show();
La declaración anterior crea espacio de memoria para un array de 10 objetos de tipo item.
Punteros a clases derivadas: Los punteros se pueden declarar a la clase derivada. se puede utilizar para
acceder a los miembros de la clase base y la clase derivada. Un puntero de una clase base también puede
utilizarse para apuntar a un objeto de una clase derivada, pero sólo puede acceder a los miembros heredados de
la clase base.
#include<iostream.h>
clase base
{
público:
int a;
void get_a(int x)
{
a=x;
}
void visualizar_a()
{
cout<<"En base"<<"\n"<<"a="<<a<<<endl;
}
};
clase derivada:base pública
{
int b;
público:
void get_ab(int x,int y)
{
a=x;
b=y;
}
void mostrar_ab()
{
cout<<"En Derivados"<<"\n"<<"a="<<a<<"\nb="<<b<<<endl;
}
};
int main()
{
base b;
base *bptr;
bptr=&b;//apunta al objeto de la clase base
bptr->get_a(100);
bptr->display_a();
derivado d;
derivado *dptr;
dptr=&d;//apunta al objeto de la clase derivada
dptr->get_a(400);
dptr->display_a();
dptr->get_ab(300,200);
dptr->display_ab();
Devuelve 0;
}
Salida:
En la base
a=100
En la base
a=400
En Derivados
a=300
b=200
En la base
a=400
El polimorfismo se refiere a la propiedad por la cual objetos pertenecientes a distintas clases son
capaces de responder al mismo mensaje, pero de distinta forma. Un requisito esencial del polimorfismo es, por
tanto, la capacidad de referirse a objetos sin tener en cuenta sus clases.
Cuando utilizamos el mismo nombre de función tanto en la clase base como en la derivada, la función
en la clase base se declara como virtual utilizando la palabra clave virtual que precede a su declaración normal.
Cuando una función se hace virtual, C++ determina qué función utilizar en tiempo de ejecución basándose en
el tipo de objeto apuntado por el puntero base, en lugar del tipo del puntero. Así, haciendo que el puntero base
apunte a diferentes objetos, podemos ejecutar diferentes versiones de la función virtual.
#include<iostream.h>
clase Base
{
público:
void display()
{
cout<<"Base de la pantalla";
}
virtual void show()
{
cout<<"Mostrar Base";
}
};
clase Derivados : public Base
{
público:
void display()
{
cout<<"Mostrar derivado";
}
void mostrar()
{
cout<<"mostrar derivados";
}
};
void main()
{
Base b;
Derivado d;
Base *ptr;
cout<<"ptr apunta a Base";
ptr=&b;
ptr->display(); //llama a Base
ptr->show(); //llama a Base
cout<<"ptr apunta a derivado";
ptr=&d;
ptr->display(); //llama a Base
ptr->show(); //clase Derivada
}
Salida:
Base de exposición
Mostrar derivados
Cuando se hace que ptr apunte al objeto d, la sentencia ptr->display(); sólo llama a la función
asociada a la Base, es decir Base::display()
ptr->show();
llama a la versión derivada de show(). Esto se debe a que la función display() no se ha hecho virtual en la clase
Base.
Cuando se crean funciones virtuales para implementar la vinculación tardía, se deben observar algunas
reglas básicas que satisfagan los requisitos del compilador.
SOBRECARGA DE OPERADORES
C++ tiene la capacidad de dotar a los operadores de un significado especial para un tipo de datos. El
mecanismo para dar estos significados especiales a un operador se conoce como sobrecarga de operadores.
Podemos sobrecargar todos los operadores excepto los siguientes:
Operador de acceso a miembros de clase ("." Y "
.*") Operador de resolución de ámbito "::"
Operador de tamaño (sizeof)
Operador condicional
Para definir una tarea adicional a un operador, especifique lo que significa en relación con la clase a la
que se aplica el operador. Esto se hace con la ayuda de una función especial, llamada función de
operador. El proceso de sobrecarga implica los siguientes pasos:
1. Cree una clase que defina el tipo de datos que se va a utilizar en la operación de sobrecarga.
2. Declarar la función operador op() en la parte pública de la clase. Puede ser una función miembro o
una función amiga.
3. Aquí op es el operador a sobrecargar.
4. Definir la función de operador para implementar las operaciones requeridas.
Ex:
complejo complejo::operador+(complejo c)
{
complejo t;
t.real=real+c.real;
t.img=img+c.img;
devolver t;
}
Concepto de sobrecarga de operadores
Una de las características únicas de C++ es la sobrecarga de operadores. Aplicar la sobrecarga a los operadores
significa, mismo operador en responder de manera diferente. Por ejemplo, el operador + puede utilizarse como
operador de concatenación y como operador adicional.
1. La función operadora debe ser una función miembro o una función amiga.
2. Si la función del operador es una función amiga, tendrá un argumento para el operador unario
& dos argumentos para el operador binario
3. Si la función de operador es una función miembro, tendrá cero argumentos para el operador
unario y un argumento para el operador binario.
Ex:
void operador-()
{
real=-real;
img=-img;
}
Sintaxis del operador unario (fuera de una clase)
tipo de retorno classname::operatorymbol( )
{
//cuerpo de la función
}
Ejemplo 1:-
void operator++()
{
contra++;
}
Ejemplo 2:-
void complejo::operador-()
{
real=-real;
img=-img;
}
a=0;
} fact (int i) {
a=i;
}
hecho operador!()
{
int f=1,i;
hecho t;
for (i=1;i<=a;i++)
{
f=f*i;
}
t.a=f;
devolver t;
}
void display()
{
cout<<"El factorial"<< a;
}
};
void main()
{
int x;
cout<<"introduce un número";
cin>>x;
hecho s(x),p;
p=!s;
p.display();
}
Explicación:
Hemos tomado "!" como operador para sobrecargar. Aquí el nombre de la clase es un hecho. Constructor sin
parámetros para tomar inicialmente el valor de "x" como 0. Constructor con parámetro para tomar el valor de "x
" . Hemos creado dos objetos uno para hacer el factorial y otro para devolver el factorial. Aquí el número de
parámetros para una función sobrecargada es 0. Factorial es un operador unario porque opera sobre un elemento
de datos. la sobrecarga del operador encuentra el factorial del objeto. La función de visualización para imprimir
el resultado.
Ejemplo 1:-
Escribe un programa para sobrecargar el operador unario -
#include<iostream>
using namespace std;
clase compleja
{
float real,img;
público:
complejo();
complex(float x, float y);
void display();
void operator-();
};
complejo::complejo()
{
real=0;img=0;
}
complex::complex(float x, float y)
{
real=x;
img=y;
}
void complejo::mostrar()
{
int imag=img;
if(img<0)
{
imag=-img;
cout<<real<<" -i"<<imag<<<endl;
}
si no
cout<<real<<" +i"<<img<<<endl;
}
void complejo::operador-()
{
real=-real;
img=-img;
}
int main()
{
complejo c(1,-2);
c.display();
cout<<"Después de Unary - operación\n";
-c;
c.display();
}
Ejemplo 2:-
#include<iostream.h>
using namespace std;
espacio de clase
{
int x,y,z;
público:
void getdata(int a,int b,int c);
void display();
void operator-();
};
void space :: getdata(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
void espacio :: mostrar()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"z="<<z<<endl;
}
void espacio :: operador-()
{
x=-x;
y=-y;
z=-z;
}
int main()
{
espacio s;
s.getdata(10,-20,30);
s.display();
-s;
cout<<"después de la negación\n";
s.display();
}
Salida:
x=10
y=-20
z=30
después de la negación
x=-10
y=20
z=-30
Es posible sobrecargar un operador menos unario utilizando una función amiga de la siguiente manera:
friend void operator-(space &s);
Ejemplo 3:-
Operador menos unario utilizando una función amiga
#include<iostream.h>
#include<iostream.h>
using namespace std;
espacio de clase
{
int x,y,z;
público:
void getdata(int a,int b,int c);
void display();
friend void operator-(space &);
};
void space :: getdata(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
int main()
{
espacio S;
S.getdata(10,-20,30);
S.display();
-S;
cout<<"después de la negación\n";
S.display();
}
Salida:
10 -20 30
después de la negación
-10 20-30
Sintaxis del operador binario (dentro de una clase) operador de tipo retorno
operatorsymbol(argumento) {
//cuerpo de la función
}
Sintaxis para la definición del operador binario (fuera de una clase) return-type classname::operator
operatorsymbol(argument) {
//cuerpo de la función
}
1. Sustituir la declaración de la función miembro por la declaración de la función amiga en la clase amiga
complejo operador+(complejo, complejo)
2. Redefina la función de operador como sigue:
operador complejo+(complejo a, complejo b)
{
return complejo((a.x+b.x),(a.y+b.y));
}
Escribe un programa para sobrecargar operadores aritméticos en números complejos usando la función
amiga #include<iostream.h>
clase compleja
{
float real,img;
público:
complex(){ }
complex(float x, float y)
{
real=x;
img=y;
}
amigo operador complejo+(complejo);
void display();
};
operador complejo+(complejo c1, complejo c2)
{
temperatura compleja;
temp.real=c1.real+c2.real;
temp.img=c1.img+c2.img;
devolver temp;
}
void complejo::mostrar()
{
Si(img<0)
{
img=-img;
cout<<real<<"-i"<<img;
}
si no
cout<<real<<"+i"<<img;
}
int main()
{
complejo c1,c2,c3;
c1=complejo(2,5,3,5);
c2=complejo(1,6,2,7);
c3=c1+c2;
c3.display();
Devuelve 0;
}
UNIDAD -5
PROGRAMACIÓN GENÉRICA(Plantillas)
La programación genérica es un enfoque en el que los tipos genéricos se utilizan como parámetros en los
algoritmos para que funcionen con una variedad de tipos y estructuras de datos adecuados.
Una ventaja significativa de la programación orientada a objetos es la reutilización del código, que
elimina la codificación redundante. Una importante característica de C++ denominada plantillas refuerza esta
ventaja de la programación orientada a objetos y proporciona una gran flexibilidad al lenguaje. Las plantillas
admiten la programación genérica, lo que permite desarrollar componentes de software reutilizables, como
funciones, clases, etc., que admiten distintos tipos de datos en un único marco.
Plantillas Concepto
Introducción
En lugar de escribir funciones diferentes para los distintos tipos de datos, podemos definir funciones comunes
Las funciones de plantilla son la forma de hacer funciones/clases abstractas creando el comportamiento de la
función sin saber qué datos serán manejados por una función. En cierto sentido, esto es lo que se conoce como
"programación o funciones genéricas".
La función de plantilla se centra más en el pensamiento algorítmico que en un medio específico de tipo de
datos único. Por ejemplo podrías hacer una función push de pila templada. Esta función push puede manejar la
operación de inserción a una pila en cualquier tipo de datos en lugar de tener que crear una función push de
pila para cada tipo diferente.
Sintaxis:
plantilla < clase tipo >
ret_type nombre_funcion(lista_parametros)
{
--------------//cuerpo de la función
} //www.suhritsolutions.com
1 Plantillas .Function
2 Plantillas de clase.
Plantillas de funciones
Las plantillas declaradas para funciones se denominan plantillas de funciones. Una plantilla de función define
cómo puede construirse una función individual.
Sintaxis :
plantilla <clase tipo,.........>
ret _type fun_ nombre(argumentos)
{
-----------------// cuerpo de la función
-----------------
}
PLANTILLAS DE CLASE
Las plantillas declaradas para las clases se denominan plantillas de clase. Una plantilla de clase
especifica cómo se pueden construir las clases individuales de forma similar a la especificación de clase
normal. Estas clases modelan una clase genérica que soporta operaciones similares para diferentes tipos de
datos. Forma general de una plantilla de clase
…; ….
}
Una clase creada a partir de una plantilla de clase se denomina clase de plantilla. La sintaxis para definir un
objeto de una clase de plantilla es:
classname<type> objectname(arglist);
#include<iostream.h>
#include<conio.h>
plantilla <clase T> clase swap
{
T a,b;
público:
intercambio(T x,T y)
{
a=x;
b=y;
}
void swapab()
{
T temp;
temp=a;
a=b;
b=temp;
}
void showdata()
{
cout<<a<<b;
}
};
void main()
{
int m,n;
float m1,n1;
cout<<"Introducir valores enteros";
cin>>m>>n;
cout<<"Introducir valores flotantes";
cin>>m1>>n1;
swap<int> c1(m,n);
swap<float> c2(m1,n1);
c1.swapab();
c1.showdata();
c2.swapab();
c2.showdata();
}
Sintaxis:
Prueba(T1 x,T2 y)
{ a=x; b=y;
}
void mostrar()
{
cout<<a<<b;
}
};
void main()
{
Test<float,int> test1(1.23,123);
Test<int,char> test2(100, "w");
test1.show();
test2.show();
}
PLANTILLAS DE FUNCIONES
Al igual que las plantillas de clases, también podemos definir plantillas de funciones que se utilizarían para
crear una familia de funciones con diferentes tipos de argumentos.
Formulario general:
plantilla <clase T>
return-type nombre-función (argumentos de tipo T)
{}
#include<iostream.h>
plantilla<clase T>
void swap(T &x, T &y)
{
T temp = x;
x=y;
y=temp;
}
void fun(int m,int n,float a,float b)
{
cout<<m<<n;
swap(m,n);
cout<<m<<n;
cout<<a<<b;
swap(a,b);
cout<<a<<b;
}
int main()
{
fun(100,200,11.22,33.44);
Devuelve 0;
}
Ejemplo 2:-
#include < iostream.h >
#include < conio.h >
plantilla
T máx(T a, T b)
{
si(a>b)
devolver a;
si no
devolver b;
}
void main( )
{
char ch1,ch2,ch3;
cout<<"introduce dos caracteres"<< ch2<< ch3;
cin>>ch2>>ch3;
d=max(ch2,ch3);
cout<<"max(ch2,ch3)"<< ch1;
int a,b,c;
cout<<"introduce dos enteros:";
cin>>a>>b;
c=max(a,b);
cout<<"max(a,b):"<< c<<< endl;
float f1,f2,f3;
cout<<"introduce dos flotantes< f1f2 >:";
cin>>f1,f2;
f3=max(f1,f2);
cout<<"max(f1,f2):"<< f3;
}
salida:
introduzca dos caracteres: A,B
max(ch2,ch3):B
introduzca dos números enteros:20,10
max (a,b) :20
introduce dos flotantes :20.5,30.9
máx (f1,f2) :30,9
}
#include<iostream.h>
#inlcude<string.h>
template<clas T1, class T2> void display(T1 x,T2 y) {
cout<<x<<y;
}
int main()
{
display(1999, "EBG");
pantalla(12.34,1234);
Devuelve 0;
}
Gestión de excepciones
Excepciones: Las excepciones son anomalías en tiempo de ejecución o condiciones inusuales que un programa
puede encontrar mientras se ejecuta. Las anomalías pueden incluir condiciones tales como la división por cero,
el acceso a una matriz fuera de sus límites o quedarse sin memoria o espacio en disco. Cuando un programa
encuentra una condición de excepción, debe ser identificada y tratada.
Las excepciones permiten transferir el control de una parte del programa a otra. El manejo de
excepciones en C++ se basa en tres palabras clave: try, catch y throw.
1.Excepciones síncronas: Errores como "índice fuera de rango" y "exceso de flujo" son excepciones síncronas.
2.Excepciones asíncronas: Los errores que se generan por cualquier evento fuera del control del programa se
denominan excepciones asíncronas
El objetivo del tratamiento de excepciones es proporcionar un medio para detectar y notificar una
circunstancia excepcional.
El manejo de excepciones en C++ se basa en tres palabras clave: try, catch y throw.
Try se utiliza para preceder un bloque de sentencias que pueden generar excepciones. Este bloque de sentencias se conoce
como bloque try. Cuando se detecta una excepción, se lanza utilizando la sentencia throw en el bloque try. El bloque
Catch captura la excepción lanzada por la sentencia throw en el bloque try y la maneja apropiadamente.
#include<iostream>
using namespace std;
int main()
{
int a,b;
cout<<"Introduce dos valores enteros cualesquiera";
cin>>a>>b;
int x=a-b;
pruebe
{
if(x!=0)
{
cout<<"Resultado(a/x)="<<a/x<<<endl;
}
si no
{ tirar x;
}
}
catch(int ex)
{
cout<<"Exception caught:Divide By Zero \n";
}
}
MECANISMO DE LANZAMIENTO
Cuando se detecta una excepción, puede eliminarse utilizando la sentencia throw en cualquiera de las
siguientes formas
throw(excepción); throw excepción;
tirar;
MECANISMO DE CAPTURA:
• Cuando se lanza una excepción, se busca en el controlador de excepciones una coincidencia adecuada.
• Es posible que los argumentos de varias sentencias catch coincidan con el tipo de una excepción. En
estos casos se ejecuta el primer manejador que coincida con el tipo de excepción
cout<<"capturado un entero"<<endl;
}
catch(double d)
{
cout<<"capturado un doble"<<endl;
}
}
int main()
{
prueba(1);
prueba(0);
prueba(-1);
prueba(2);
Devuelve 0;
}
Salida:
capturó un número entero
atrapó a un personaje
atrapó un doble
fin del bloque try
todos los tipos posibles de excepciones y, por lo tanto, es posible que no pueda diseñar gestores de captura
independientes para capturarlas. En tales circunstancias, podemos forzar una sentencia catch para que atrape
todas las excepciones en lugar de sólo un determinado tipo.
catch(...)
{}
Devuelve 0;
}
Es posible volver a pasar la excepción capturada por un bloque catch a otro manejador de excepciones.
Esto se conoce como Retirada.
#include <iostream>
using namespace std;
void MiHandler()
{ try {
lanza "hola";
}
catch (const char*)
{
cout <<"Excepción capturada dentro de MyHandler\n";
throw; //retirar char* de la función
}
}
int main()
{ cout<< "Inicio principal "<<endl; try
{
MyHandler();
}
catch(const char*)
{
cout <<"Capturada excepción dentro de Main\n";
}
cout << "Fin principal";
Devuelve 0;
}
Especificación de excepciones:
La especificación de excepciones restringe las funciones para lanzar algunas excepciones especificadas sólo
con el uso de throw(lista de excepciones) en la cabecera de la función.
Formulario general
Tipo nombre_función(lista argumentos) throw(excepciones -lista)
{
Declaraciones
intentar {
declaraciones
}
#include <iostream>
using namespace std;
void test(int x) throw(int,float,char)
{
switch(x)
{
caso 1:lanzar x;
romper;
caso 2:throw 'x';
romper;
caso 3:throw doble(x);
romper;
caso 4:throw float(x);
romper;
}
}
int main()
{
pruebe
{
test(4);//test(4) conduce a una terminación anormal
}
catch(int i)
{
cout <<"Capturada excepción de tipo int\n";
}
catch(float f)
{
cout <<"Capturada excepción de tipo float\n";
}
catch(char c)
{
cout <<"Capturada excepción de tipo char\n";
}
catch(double i)
{
cout <<"Atrapado Excepción de tipo doble\n";
}
Devuelve 0;
}