Argumento Padrão em C++
Já aprendemos como enviar informações para funções, através do uso de parâmetros e argumentos.Vamos supor que queiramos somar dois números, a e b, a função seria:
float sum2(float a, float b) { return a+b; }Agora vamos supor que queiramos calcular a soma de três variáveis, teríamos que fazer uma função assim:
float sum3(float a, float b, float c) { return a+b+c; }Note que teríamos que usar outra função, com outro nome, pro mesmo propósito: somar os argumentos. Não é algo muito inteligente, concorda?
Seria legal se uma mesma função somasse 2 ou 3 argumentos, o tanto que o usuário quiser.
Para somar dois números, seria interessante fazer: sum(1,2);
Para somar três números, faríamos: sum(1,2,3);
É aí que entra o conceito de argumento padrão.
Basta declararmos o protótipo da função assima:
- float sum(float a, float b, float c = 0.0);
E seu escopo:
float sum(float a, float b, float c = 0.0) { return a+b+c; }O que ocorre é o seguinte:
O valor padrão de c é 0.0
Caso você faça: sum(1,2, 3), o valor de c será 3.
Caso faça: suma (1,2), você não estará definindo valor para c, logo ele vai assumir o valor padrão, que é 0. Entendeu? Argumento com valor padrão, caso você não forneça esse valor.
Teste:
#include <iostream> using namespace std; float sum(float a, float b, float c = 0.0) { return a+b+c; } int main() { cout<<sum(1,2)<<endl; cout<<sum(1,2,3)<<endl; return 0; }Funciona pra 2 ou 3 variáveis, a gosto do freguês!
Omissão de argumentos
O código anterior funciona para somar 2 ou 3 números.Para somarmos 2, 3 ou 4 números, poderíamos fazer:
float sum(float a, float b, float c = 0.0, float d = 0.0) { return a+b+c+d; }Agora você pode fazer:
sum(1,2);
sum(1,2,3);
sum(1,2,3,4);
No primeiro caso, omitimos o argumento c e o d.
No segundo exemplo, omitimos o argumento d.
No último exemplo, não omitimos nenhum argumento.
Ou seja, argumentos padrões são automaticamente substituídos, quando informamos os argumentos.
Regras no uso de argumentos padrão
Quando informamos e passamos argumentos para uma função, eles são copiados da esquerda pra direita.Por exemplo: sum(1,2,3)
O 1 vai pro 'a', o 2 pro 'b' e o valor 3 vai pro parâmetro 'c'. O valor do argumento 'd', então, é o argumento padrão, que definimos como 0.
Outra regra é que, uma vez que usemos um argumento padrão em um parâmetro, todos os outros parâmetros subsequentes deverão também ter argumentos padrão também. Por exemplo, o protótipo de função a seguir é válido:
- float volume(float base, float height=1, float width=1);
'height' é um argumento padrão, e o seguinte também.
Já o seguinte protótipo de função é inválido:
- float volume(float height=1, float base, float width=1);
Como o primeiro argumento é padrão, todos os outros devem ser, e o 'base' é um parâmetro normal, que deve ser necessariamente fornecido pela chamada da função.
Outro ponto é que os parâmetros com argumentos padrão devem ser declarados na primeira ocorrência da declaração da função. Ou seja, se você usar um protótipo de uma função e depois em outro lugar vai definir o escopo da sua função, os argumentos padrão devem ser definidos já no protótipo, que vai vir antes. Por exemplo, você pode inclusive abreviar assim:
Protótipo: double area( double = 1.0, float 2.0);
Definição da função: double area (double length, float witdh) { return length*width; }
Assim, recapitulando, seja a função:
double area (double length = 1.0, float witdh = 2.0) { return length*width; }Se fizermos as seguintes chamadas de função:
- area() - serão usados os valores 1.0 e 2.0 para calcular a área, respectivamente, ou seja, estamos usando os dois argumentos padrão.
- area(3) - serão usados os valores 3 e 2.0 para calcular a área, ou seja, o primeiro argumento padrão foi substituído por 3
- area(3,6) - serão usados os valores 3 e 6 para calcular a área, ou seja, os dois argumentos padrão foram substituídos.
Vamos ver isso na prática? Teste o seguinte código:
#include <iostream> using namespace std; void area(float = 1.0, float = 1.0); int main() { cout << "Nenhum argumento passado:"<<endl; area(); cout << "\nPrimeiro argumento passado:"<<endl; area(2.0); cout << "\nAmbos argumentos passados:"<<endl; area(2.0, 3.0); return 0; } void area(float length, float width) { cout << "Area: " << length * width << endl; }
Deu tudo certo? Sim? Então vamos seguir em nossos tutoriais de C++.
Nenhum comentário:
Postar um comentário