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

editar

Em 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)

editar

Pode 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.