Toda tarefa pode ser dividida em sub-tarefas, cada qual podendo ser representada tanto na forma de código, como ser divida em sub-tarefas ainda menores. Este método é chamado de refinamento passo a passo.. Funções são usadas para escrever o código das sub-tarefas a serem resolvidas. O código que descreve o que uma função faz é chamado de definição de função:

function_header
{
instruções
}

Tudo que está antes da primeira chave é o cabeçalho (header) da definição de função, e o que está entre as chaves é o corpo (body) da definição de função. O cabeçalho de função (function header) inclui a descrição do tipo de valor de retorno, o nome (identificador) e os parâmetros formais. O número de parâmetros passados para a função é limitado e não pode exceder 64.

A função pode ser chamada de outras partes do programa quantas vezes forem necessárias. Na verdade, o tipo de retorno, o identificador da função e os tipos de parâmetros constituem o protótipo da função.

Protótipo de função é a declaração da função, mas não a sua definição. Devido a declaração explícita do tipo de retorno e da lista dos tipos de argumentos, a verificação estrita de tipo e a implícita conversão de tipo (typecasting) são possíveis durante as chamadas de função. Muito freqüentemente declarações de funções são usadas em classes para melhorar a legibilidade do código.

As definições de função devem corresponder exatamente à sua declaração. Cada função declarada deve ser definida.

Exemplo:

double // tipo do valor de retorno
linfunc (double a, double b) // nome da função e lista de parâmetros
{
// operador composto
return (a + b); // valor do retorno
}



O operador return pode retornar o valor de uma expressão localizada neste operador. Se necessário, o valor da expressão é convertido para o tipo do resultado da função. Pode ser retornado: tipos simples, estruturas simples, ponteiros de objetos. Com o operador return não se pode retornar arrays, objetos de classe, variáveis de tipo estrutura composta.

Uma função que não retorna nenhum valor deve ser descrita como do tipo void.

Exemplo:

void errmesg(string s)
{
Print("erro: "+s);
}



Parâmetros passado para a função podem ter valores default (padrão), que são definidos por constantes daquele tipo.

Exemplo:

int somefunc(double a,
double d=0.0001,
int n=5,
bool b=true,
string s="string transmitida")
{
Print("Parâmetro obrigatório a = ",a);
Print("Transmitir os seguintes parâmetros: d = ",d," n = ",n," b = ",b," s = ",s);
return(0);
}



Se algum dos parâmetros tem um valor default, todos os parâmetros subseqüentes devem também ter valores default.

Exemplo de declaração incorreta:

int somefunc(double a,
double d=0.0001, // valor padrão declarado 0.0001
int n, // não é determinado o valor padrão!
bool b, // não é determinado o valor padrão!
string s="string transmitida")
{
}