Ajude nosso projeto a se manter online.

Argumentos Padrão e Omissão de Argumentos

Neste tutorial de C++, vamos aprender o que é um argumento padrão, para que serve e como usar, bem como omitir um argumento numa chamada de uma função.

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:

  1. 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.
  2. 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
  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