Programar em C++/Funções
Função, do latim functio, onis, representa na computação, um pequeno algoritmo com uma função simples e bem definida. É como se cada função fosse um micro programa, ou um tijolo na construção do programa principal. O uso de funções facilita muito o desenvolvimento, pois, divide o problema principal em pequenos problemas mais simples. Essa técnica se chama, Dividir para conquistar.
A experiência mostra que o uso de funções facilita e acelera a criação e manutenção de sistemas.
Todo programa em C++ tem pelo menos uma função, o main. Veja o exemplo do programa em C++:
#include <iostream> //Biblioteca com funções de entrada e saída de dados
using namespace std;
int main (void) //Função principal do programa
{
cout << "Olá mundo!"; //cout também é uma função, e precisa ser importada da biblioteca iostream
//Esta função main retorna um valor int, ou inteiro, por isso faz a operação de retornar 0
return 0;
}
Do exemplo Olá mundo, vemos que toda função em C++ tem um nome. O nome de uma função junto com o tipo de dados que retorna é chamado assinatura da função.
int main (void) //Assinatura da função main
Essa assinatura informa que a função de nome main retorna na sua execução um valor do tipo int, ou inteiro, e recebe void como parâmetro. Receber void significa que a função não recebe parâmetro, se a função retorna void, significa que não retorna nada. Algumas funções não precisam retornar nenhum valor para funcionar, apenas realizar alguma ação.
Sobrecarga de funções
editarEm C++ duas funções podem ter o mesmo nome se:
- Tiverem um nº diferente de parâmetros e/ou
- Se os parâmetros forem de tipos diferentes (ints floats,..)
A função não pode ser overloaded apenas com diferentes tipo de retorno de função (ie, uma função retornar ints e a outra retornar floats) então os parâmetros é que interessam.
#include <iostream> using namespace std; void ConvertFToC(double f, double &c); void ConvertFToC(float f, float &c); void ConvertFToC(int f, int &c); int main() { double df, dc; float ff, fc; int i_f,i_c; //if is a reserved word df = 75.0; ff = 75.0; i_f = 75; // The compiler resolves the correct // version of ConvertFToC based on // the arguments in each call cout << "Calling ""double"" version" << endl; ConvertFToC(df,dc); cout << df << " == " << dc << endl << endl; cout << "Calling ""float"" version" << endl; ConvertFToC(ff,fc); cout << ff << " == " << fc << endl << endl; cout << "Calling ""int"" version" << endl; ConvertFToC(i_f,i_c); cout << i_f << " == " << i_c << endl << endl; system ("pause"); } void ConvertFToC(double f, double &c) { cout << "In ""double"" version" << endl; c = (f - 32.0) * 5. / 9.; } void ConvertFToC(float f, float &c) { cout << "In ""float"" version" << endl; c = (f - 32.0) * 5. / 9.; } void ConvertFToC(int f, int &c) { cout << "In ""int"" version" << endl; c = (f - 32) * 5. / 9.; }
O que é que acontece se tivermos um nº diferente de argumentos entre a chamada e a definição?
A solução aqui proposta é quando não sabemos a quantidade de parâmetros que a função vai ser chamada ou mesmo a tipologia desses argumentos, o que se sugere é fazer várias definições para a função e dar a todas elas o mesmos nome, que o compilador vai saber escolher a definição correcta através do nº e tipologia de argumentos.
Entretanto, por boa prática, as funções não devem ser sobrecarregadas se fizerem operações distintas.
Parâmetros default (padrão)
editarPode acontecer que tenhamos que declara varia vezes o mesmo valor como parâmetro de uma função. Para simplificar a chamada a funções que variam pouco podemos definir uma parâmetro default.
#include <stdio.h> #include <stdlib.h> /*-----------------------------Cabeçalho--------------------------------*/ /*Definimos uma funçao*/ void function(int a,int b, int c = 100 ) { printf("Meu Primeiro argumento :%d\n",a ); printf("Meu Segundo argumento :%d\n",b ); printf("Meu terceiro argumento :%d\n",c ); getchar(); } int main (void) { function( 10, 30); /* Agora use a função assim e veja o que acontece */ // function( 10,30,999); }
Os parâmetros por default devem ser os últimos da lista, ou seja, mais à direita. O parâmetro padrão deve ser especificado no protótipo e não na declaração da função.