C++ - Funções Conjunto de instruções para executar uma tarefa particular, agrupadas numa unidade com um nome para referenciá-las. O código é agregado ao programa uma única vez e pode ser executado muitas vezes. tipo nome ( declaração dos parâmetros ) { instrução_1; instrução_2;... instrução_n; } Ex.: Função simples Forma geral das funções C++ int celsius (int fahr); //Protótipo (declaração) void main( ) { int c, f; cout << \ndigite a temperatura em Fahrenheit : ; cin >> f; c = celsius (f) ; // Chamada à função cout << \ncelsius = << c; } int celsius (int fahr) { int c; c = (farh - 32) * 5/9; return c; } // Definição da função Protótipo de função É a declaração de uma função. Deve preceder sua definição e sua chamada. Pode ser: externo - escrito antes de qualquer função, como no exemplo anterior. É visível para todas as funções que a chamam. local - escrito no corpo de todas as funções que a chamam, antes da chamada. Void main ( ) { int celsius ( int fahr);... omitido - funções definidas antes de serem chamadas não necessitam de protótipo.
Bons programadores escrevem os protótipos de todas as funções, criando para isto, inclusive arquivos de cabeçalho. No protótipo, o nome dos parâmetros é facultativo mas o tipo é obrigatório. Ex.: int celsius (int); Tipos de funções É determinado pelo valor que ela retorna via comando return e não pelo tipo de argumentos que ela recebe. Comando return Termina a execução da função e retorna o controle para a instrução seguinte do código de chamada. Sintaxe : return; return expressão; return (expressão); Ex.: int celsius ( int fahr) { return (fahr - 32) * 5/9; } Observ.: Uma função sem comando return termina quando encontra a chave } que indica fim da função. O comando return pode retornar somente um único valor para a função que chama. Parâmetros da função São as informações transmitidas para uma função. Passagem de parâmetros: por valor por referência Por valor : a função cria uma nova variável para receber o valor passado. Ex.: fahr na função celsius. Por referência : através do operador unário de referência & que cria outro nome para uma variável já criada. Assim a função acessa as variáveis da função que chamou, possibilitando o retorno de mais de um valor. Ex.: Função que reajusta o preço de um produto em 20%, retornando o novo preço e o valor do aumento. void reajusta20 ( float& p, float& r); // Protótipo void main ( ) { float preco, aumento; do { cout << \ninsira preco atual (0 encerra) : ; cin >> preco;
reajusta20 (preco, aumento); // Chamada cout << Preco novo : << preco << \naumento : << aumento; } while (preco!= 0.0); void reajusta20 ( float& p, float& r) { r = p*0.2; p = p*1.2; } Referências constantes Utilizadas quando a função não necessita alterar as variáveis. Ex.: int n = 456; const int& n1=n; Estas declarações fazem de n1 um nome read -only para n. Vantagem : Economia de memória e preservação da variável pois: passagem por valor : cria cópia (gasta mais memória) passagem por referência : torna a variável vulnerável (pode ser modificada) Programa com várias funções Um programa pode conter várias funções e qualquer função pode chamar qualquer outra. Não é permitido definir uma função dentro de outra. São módulos independentes. Ex.: Centraliza um texto com moldura void linha (int n); void espacos (int n); void main ( ) { cout << \n\n ; espacos (30); linha (21); cout << \n ; espacos (30); cout << * Feliz Aniversario * \n ; espacos (30); linha (21); } void linha (int n) { for (int i=0; i<n; i++) cout << * ; } void espacos (int n) { for (int i=0; i<n; i++) cout << ;
} Ex.: Soma dos quadrados de dois números float somasqr (float m, float n); float sqr (float z); float soma (float m, float n); Função como argumento de outra função void main ( ) { float a, b; cout << \ndigite dois numeros ; cin >> a >> b; cout << \na soma quadrados é << somasqr (a, b); } float somasqr (float m, float n) { return soma (sqr (m), sqr (n) ); } float sqr (float z) { return z*z; } float soma (float m, float n) { return m+n; } Valores default para os argumentos de função Colocados no protótipo. Se forem omitidos os argumentos correspondentes na chamada à função, os valores default serão automaticamente usados. Ex.: Execute para ver a saída void linha (int n = 20, char ch = * ); void main( ) { linha( ); cout << \n ; linha (34); cout << \n ; linha 45, = ) cout << \n ; } void linha (int n, char ch) { for (int i=0; i<n; i++) cout << ch; } Observ. : Se um argumento for omitido, todos os subsequentes deverão ser omitidos.
linha (, + ); // ERRO Se um parâmetro for inicializado, todos os seguintes devem ser inicializados. void linha (int n=20, char ch); //ERRO Sobrecarga de funções Família de funções com o mesmo nome mas com lista de parâmetros diferentes (número ou tipo). Ex.: Cálculo do cubo de um número int cubo (int n); float cubo (float n); double cubo (double n); void main( ) { cout << cubo(876) << \n ; cout << cubo(12.34) << \n ; cout << cubo(double(4567.35)) << \n ; } int cubo (int n) { return n*n*n; } float cubo (float n) { return n*n*n; } double cubo (double n) { return n*n*n; } Observ. : O sistema considera somente a lista de parâmetros para escolher a função apropriada a cada chamada, e não o valor de retorno. int minhaf (int); float minhaf (int); // Errado. Parâmetro igual Funções inline A palavra chave inline, quando colocada como primeiro elemento do cabeçalho da definição de uma função, causa a inserção de uma nova cópia da função em todo o lugar onde ela é chamada. Uso : Com funções pequenas. Vantagem : Poupa tempo de execução.
#include <conio.h> inline char minusculo (char ch) { return ((ch >= A && ch <= Z )? (ch- A + a ) : ch); } Observ. : A definição de uma função inline deve preceder a primeira chamada a ela (código escrito antes de main).