# 8 - Funções
Você já sabe que todo programa deve ter uma função chamada main (que é onde o programa inicia a execução quando é executado). No entanto, a medida que os programas começam a ficar cada vez mais longos, a colocação de todo o código dentro da função principal torna-se cada vez mais difícil de trabalhar. As funções fornecem uma maneira de dividir nossos programas em pequenos blocos modulares que são mais fáceis de organizar, testar, usar e reusar. A maioria dos programas usam muitas funções. A biblioteca padrão C++ vem com muitas funções já escritas para você usar, mas é comum escrever funções próprias.
Considere um caso que pode ocorrer na vida real: você está lendo um livro quando lembra que precisa fazer uma ligação telefônica. Você coloca um marcador em seu livro, faz a ligação e, quando termina a ligação, volta ao local marcado e continua seu livro exatamente onde parou.
Programas C++ podem funcionar da mesma maneira. Um programa estará executando instruções sequencialmente dentro de uma função quando encontrar uma chamada de função. Uma chamada de função é uma expressão que informa a CPU para interromper a função atual e executar outra função. A CPU “coloca um marcador” no ponto atual de execução e, em seguida, chama (executa) a função nomeada na chamada de função. Quando a função chamada termina, a CPU retorna ao ponto marcado e retoma a execução.
Primeiro, vamos começar com a sintaxe mais básica para definir uma função. Para esta lição, todas as funções definidas pelo usuário (exceto main) terão o seguinte formato:
void nome_função ()
{
// código aqui
}
void
são funções que não retornam valor algum, também conhecidas como procedimento.
Exemplos:
#include <iostream>
void MostrarMensagem()
{
std::cout << "Hello World" << std::endl;
}
int main ()
{
/*|--------------------------------------|
*| |
*| He4rt Developers |
*| |
*|--------------------------------------|
*/
MostrarMensagem(); // Chamando a função
}
#include <iostream>
void CalcularSoma()
{
int a, b;
std::cout << "Digite dois numeros em sequencia" << std::endl;
std::cin >> a >> b;
std::cout << "A soma e: "<< (a + b) << std::endl;
}
int main ()
{
/*|--------------------------------------|
*| |
*| He4rt Developers |
*| |
*|--------------------------------------|
*/
CalcularSoma(); // Chamando a função
}
Considerado o exemplo anterior, podemos passar variáveis para funções por meio de parâmetros
direto do main
#include <iostream>
void CalcularSoma(int a, int b) // Parâmetros a e b, recebidos em sequência no main
{
std::cout << "A soma e: "<< (a + b) << std::endl;
}
int main ()
{
int a, b;
std::cout << "Digite dois numeros em sequencia" << std::endl;
std::cin >> a >> b;
CalcularSoma(a, b); // Chamando a função
}
Como já discutimos em seções anteriores, quando declaramos tipo a
ou tipo a = valor
ele existe apenas no escopo onde foi criado, e que chamamos de declaração na memória stack
(teremos uma seção especificamente para memória stack
e heap
)
Então os parâmetros existem APENAS
nas funções, no caso a função CalcularSoma()
não reconhece os inteiros declarados no main()
Por conta disso, parâmetros podem ter nomes diferentes em relação ao o que passamos para ela, já que não possuem relação nenhuma
Exemplo:
#include <iostream>
void CalcularSoma(int a, int b)
{
a += b;
std::cout << "A soma e: "<< a << std::endl;
}
void CalcularSubtracao(int a, int b)
{
a -= b;
std::cout << "A subtracao e: "<< a << std::endl;
}
void CalcularMultiplicacao(int a, int b)
{
a *= b;
std::cout << "A multiplicacao e: "<< a << std::endl;
}
void CalcularDivisao(int a, int b)
{
a /= b;
std::cout << "A divisao e: "<< a << std::endl;
}
int main ()
{
/*|--------------------------------------|
*| |
*| He4rt Developers |
*| |
*|--------------------------------------|
*/
int n1, n2;
char opcao;
std::cout << "Digite dois numeros em sequencia: \n";
std::cin >> n1 >> n2;
do
{
std::cout << "Digite a opcao: (A) Soma / (B) Subtracao / (C) Multiplicacao / (D) Divisao \n";
std::cin >> opcao;
switch(opcao)
{
case 'A':
{
CalcularSoma(n1, n2);
break;
}
case 'B':
{
CalcularSubtracao(n1, n2);
break;
}
case 'C':
{
CalcularMultiplicacao(n1, n2);
break;
}
case 'D':
{
CalcularDivisao(n1, n2);
break;
}
default:
{
break;
}
}
}while(opcao != 'A' && opcao != 'B' && opcao != 'C' && opcao != 'D'); // Evita de ter um input errado no std::cin >> opcao;
}
Mas, temos um porém:
n1
continua com o mesmo valor, pois a
só existe dentro da função
Da mesma forma que funções voids retornam nada, temos também funções int,float,char... que retornam o seu tipo
#include <iostream>
int CalcularSoma(int a, int b)
{
a += b;
return a; // Precisamos usar o return no que queremos retornar
}
int CalcularSubtracao(int a, int b)
{
a -= b;
return a;
}
int CalcularMultiplicacao(int a, int b)
{
a *= b;
return a;
}
int CalcularDivisao(int a, int b)
{
a /= b;
return a;
}
int main ()
{
/*|--------------------------------------|
*| |
*| He4rt Developers |
*| |
*|--------------------------------------|
*/
int n1, n2, resultado;
char opcao;
std::cout << "Digite dois numeros em sequencia: \n";
std::cin >> n1 >> n2;
do
{
std::cout << "Digite a opcao: (A) Soma / (B) Subtracao / (C) Multiplicacao / (D) Divisao \n";
std::cin >> opcao;
switch(opcao)
{
case 'A':
{
resultado = CalcularSoma(n1, n2); // resultado recebe o retorno da função
break;
}
case 'B':
{
resultado = CalcularSubtracao(n1, n2);
break;
}
case 'C':
{
resultado = CalcularMultiplicacao(n1, n2);
break;
}
case 'D':
{
resultado = CalcularDivisao(n1, n2);
break;
}
default:
{
break;
}
}
}while(opcao != 'A' && opcao != 'B' && opcao != 'C' && opcao != 'D'); // Evita de ter um input errado no std::cin >> opcao;
std::cout << "O resultado e: " << resultado << std::endl;
}
Como você já deve ter notado, a função main retorna um inteiro e podemos explicitar isso
#include <iostream>
int main ()
{
/*|--------------------------------------|
*| |
*| He4rt Developers |
*| |
*|--------------------------------------|
*/
std::cout << "Hello World" << std::endl;
return 0;
}
Podemos retornar a função main para indicar que tudo ocorreu bem por conseguir chegar no final do escopo da função principal.
Caso nada seja retornado pela função main, 0 é assumido.
Temos a biblioteca <cstdlib>
que possui EXIT_SUCCESS
, considerado uma convensão para programas em C++.
#include <iostream>
#include <cstdlib>
int main ()
{
/*|--------------------------------------|
*| |
*| He4rt Developers |
*| |
*|--------------------------------------|
*/
std::cout << "Hello World" << std::endl;
return EXIT_SUCCESS;
}
WARNING
Como já falamos, recomendamos fortemente que leia a documentação das bibliotecas que vamos apresentar durante o curso, assim conseguindo extrair ao máximo o que a linguagem C++ fornece ao desenvolvedor.