index.htm

RECETAS DE NAVIDAD

- apuntes comunicaciones javascript lenguaje c php autoayuda bolsa chistes empleo fotografia digital ocio sabiasque salud timos trucos

funciones en el lenguaje c

Las funciones se declaran y se definen exactamente igual que en el lenguaje c, y, al igual que en este, se puede utilizar prototipo (prototype).

Prototipos

La declaracion de una funcion es el prototipo. El prototipo da un modelo de la interface a la funcion. Veamos un ejemplo:

# include <iostream.h>

void haz_algo (int alas, float pies, char ojos);

main() {

int ala = 2;

float pie = 1000.0;

char ojo = 2;

haz_algo (3, 12.0, 4);

haz_algo (ala, pie, ojo);

}

void haz_algo (int alas, float pies, char ojos) {

cout << 'Hay ' << alas << 'alas.' << '\n';

cout << 'Hay ' << pies << 'pies. ' << '\n';

cout << 'Hay ' << int(ojos) << 'ojos.' << '\n';

}

La salida de este programa sera:

Hay 3 alas.

Hay 12 pies.

Hay 4 ojos.

Hay 2 alas.

Hay 1000 pies.

Hay 2 ojos.

Cada llamada a la funcion haz_algo() debe verificar:

El numero de parametros debe ser exactamente tres.

Los tipos deben ser compatibles con los de la declaracion.

Notese que cuando llamamos a la funcion, la comprobacion de tipo la hace el compilador basandose en el prototipo (en la declaracion) puesto que la funcion todavia no ha sido definida.

Los nombres de variables que aparecen en el prototipo son opcionales y actuan casi como comentarios al lector del programa, ya que son completamente ignorados por el compilador.

Tipos compatibles

Son compatibles cualquiera de los tipos simples (definidos EN EL LENGUAJE C++) que pueden ser convertidos de uno a otro de manera significativa. Por ejemplo, si llamamos con un entero a una funcion que esta esperando un numero real como parametro, el sistema lo convertira automaticamente, sin mencionarlo al usuario. Esto tambien es cierto de float a char, o de char a int.

EN EL LENGUAJE Cambio, si pasamos un puntero a un entero a una funcion que estaba esperando un entero, no habra conversion de tipo, ya que son dos variables completamente distintas. De la misma forma, un tipo definido por el usuario (estructura o clase) no puede ser convertido automaticamente a un long float, a un array o incluso a otra estructura o clase diferente, porque son tipos incompatibles y no puede realizarse la conversion de manera significativa.

Sin embargo, el tipo devuelto por la funcion, void en el ejemplo anterior, debe ser compatible con el tipo que se espera que devuelva en la funcion de llamada, o el compilador dara un warning.

El uso de prototipos no supone coste alguno en tiempo ni en velocidad de ejecucion. El prototipo se verifica durante la compilacion.

Funciones con void como argumento.

Una funcion sin lista de argumentos como

void func ();

significa EN EL LENGUAJE C que no se ha declarado el tipo de la lista de argumentos que recibe la funcion, por lo que el compilador no producira errores respecto al uso impropio de los argumentos. Cuando EN EL LENGUAJE C se declara una funcion que no tiene argumentos se utiliza el tipo void:

void func (void);

EN EL LENGUAJE C++, ambas expresiones son equivalentes

Pasar punteros a funciones.(paso por valor y por referencia)

Cuando se llama a una funcion, todos los parametros con los que la llamamos son copiados y pasados a la funcion (paso por valor). Esto significa que si la funcion cambia el valor de los parametros, solo lo hace dentro del ambito de la funcion. Por ejemplo:

#include <iostream.h>

void change_values(int a,int b) {

a=4;

b=5;

}

main() {

int a, b;

a=1;

b=2;

change_values(a,b);

cout << 'A is ' << a <<',B is' << b <<'\n';

}

La salida de programa es: A is 1, B is 2

La llamada a la funcion no ha cambiado el valor de las variables que se le han pasado. La funcion cambia las copias de lo que se le ha pasado.

Si queremos pasar parametros por referencia hay que pasar punteros a los datos. Para hacer esto, utilizamos el operador &, que da la direccion de una variable:

#include <iostream.h>

void change_values(int *a,int *b) {

*a=4;

*b=5;

}

main() {

int a, b;

a=1;

b=2;

change_values(&a,&b);

cout << 'A is ' << a <<',B is' << b <<'\n';

}

Ahora la salida del programa es:

A is 4, B is 5

La funcion main pasa la direccion de a y b, por lo que a la funcion change_values se le pasa una copia de las direcciones. Utilizando las direcciones de a y b, la funcion puede acceder a los datos directamente.

Polimorfismo.

EN EL LENGUAJE C++ es posible declarar dos funciones diferentes que tengan el mismo nombre. Las funciones deben diferir en la lista de argumentos, bien en el numero de variables que se pasan a la funcion, bien en el tipo de argumentos que recibe. Asi, por ejemplo, se puede definir una funcion que trabaje, biEN EL LENGUAJE Con enteros, biEN EL LENGUAJE Con strings; solo hay que definir dos funciones separadas con el mismo nombre:

#include <iostream.h>

void show(int val) {

cout <<' Es un entero:'<< val << '\n';

}

void show(char *val) {

cout <<'Es un caracter: '<< val << '\n';

}

main() {

show (42);

show ('A');

show (452.2);

}

En la primera llamada a la funcion show, se le pasa un entero, por tanto se llama a la primera copia de la funcion show. La segunda vez, el argumento es un caracter, por tanto se utiliza la segunda definicion, aquella que utiliza un caracter. Ahora bien, la tercera llamada utiliza un numero real y no existe una definicion de la funcion para este caso. El compilador utiliza la primer definicion. La salida del programa es:

Es un entero:42

Es un caracter: A

Es un entero:452

Comentarios sobre la sobrecarga de funciones:

· El uso de mas de una funcion con el mismo nombre pero acciones diferentes debe ser evitado. En el ejemplo anterior, las funciones show() estan relacionadas: imprimen informacion en la pantalla.

· C++ no permite que varias funciones difieran solo en su valor devuelto. Dos funciones de este tipo no podrian ser distinguidas por el compilador.

Parametros por defecto

Es una forma de indicar que valor debe ser pasado a una funcion en el caso en que en la llamada no se pase nada, o se pasen menos argumentos de los definidos. Un ejemplo de definicion de una funcion que tiene parametros por defecto en su lista de argumentos es:

void funcion (int y = 2)

En este caso, estamos definiendo un valor, 2, que tomara la variable y EN EL LENGUAJE Caso de que no se pase nada en la llamada a la funcion:

funcion ();

Anterior paso:
reserva dinamica de memoria
Siguiente paso:
estructuras

· Introduccion al lenguaje c
· Tipos en el lenguaje c
· Variables y constantes en el lenguaje c
· Operadores en el lenguaje c
· Entrada/salida en el lenguaje c
· Estructuras de control en el lenguaje c
· Arrays y punteros en el lenguaje c
· Reserva dinamica de memoria en el lenguaje c
· Funciones en el lenguaje c
· Estructuras en el lenguaje c
· Clases
· Clases y encapsulacion en el lenguaje c
· Constructores y destructores en el lenguaje c++
· Descomposicion en modulos en el lenguaje c
· Array de objetos en el lenguaje c
· Clases static en lenguaje c
· Un objeto con un puntero interno
· Punteros a clases en c
· Objetos encadenados en c
· Sobrecarga de operadores en el lenguaje c

IMPORTANTE:

- Si te ha gustado esta pagina, por favor, votanos aqui:

- Si no te ha gustado, escribenos y cuentanos en que mejorar.

Actualizado: 16/12/2013