Tamanhos de Parâmetros e Argumentos em Funções no C++
No tutorial sobre Argumentos Padrão, vimos que é possível enviar uma quantidade variada de argumentos para uma função, desde que ela esteja usando parâmetros de referência.Por exemplo, o código abaixo é de uma função que calcula uma média aritmética:
#include <iostream> using namespace std; float average(float a, float b, float c, float d = 0.0) { return (a+b+c+d)/4; } int main() { cout<<"Media de 3 numeros: "<<average(10, 9, 7)<<endl; cout<<"Media de 4 numeros: "<<average(10, 9, 7, 6)<<endl; return 0; }Ela pode receber 3 ou 4 argumentos. Se enviar apenas 3, o 4 argumento é o padrão, de valor 0.
Porém, note um erro.
Mesmo que enviemos apenas 3 argumentos, a média aritmética é calculada como se houvessem 4 notas.
Seria interessante se, caso eu enviasse 3 argumentos, ela retornasse:
(a+b+c)/3
E caso eu enviasse 4 argumentos, ela retornasse:
(a+b+c+d)/4
E isso é possível, com sobrecarga de funções.
Sobrecarga de Funções em C++
Sobrecarga, ou overloading, é a técnica que permite que tenhamos funções com mesmo nome, desde que seus parâmetros sejam diferentes.Veja como ficaria o exemplo do programa que calcula as médias de 3 ou 4 notas:
#include <iostream> using namespace std; float average(float a, float b, float c) { return (a+b+c)/3; } float average(float a, float b, float c, float d) { return (a+b+c+d)/4; } int main() { cout<<"Media de 3 numeros: "<<average(10, 9, 7)<<endl; cout<<"Media de 4 numeros: "<<average(10, 9, 7, 6)<<endl; return 0; }Note que invocamos a função average(), a única diferença é que na primeira chamada passamos 3 argumentos, e na segunda chamada da função passamos 4 argumentos.
Como o C++ é maroto e inteligente, ele sabe qual função rodar, corretamente.
Ele é tão esperto que, mesmo que exista o mesmo número de parâmetros/argumentos, ele consegue diferenciar através do tipo de dado que estamos usando.
Veja:
#include <iostream> using namespace std; double average(double a, double b, double c) { cout<<"Media de 3 double : "; return (a+b+c)/3; } int average(int a, int b, int c) { cout<<"Media de 3 inteiros : "; return (a+b+c)/3; } int main() { cout<<average(10.0, 9.0, 7.0)<<endl; cout<<average(10, 9, 7)<<endl; return 0; }Quando passamos variáveis do tipo double, ele chama a double average()
Quando passamos variáveis do tipo int, ele chama a int average()
O C++ consegue diferenciar pois as assinaturas de cada função são diferentes (seja no número de parâmetros ou no tipo que vai trabalhar).
Aliás, até se as funções tiverem o mesmo nome, o mesmo número de parâmetros e os mesmos tipos de dados, podemos fazer sobrecarga de funções, desde que a ordem dos parâmetros seja diferente:
#include <iostream> using namespace std; void func(int a, double b) { cout<<"Primeiro é int : "<<a<<endl; cout<<"Segundo é double: "<<b<<endl; } void func(double b, int a) { cout<<"Primeiro é double: "<<b<<endl; cout<<"Segundo é int : "<<a<<endl; } int main() { func(1, 2.5); cout<<endl; func(2.5, 1); return 0; }No exemplo assim temos: func(int, double)
E também: func(double, int)
Basta que a assinatura de uma função para outra seja diferente, para podermos usar sobrecarga, onde assinatura é um conjunto de dados: nome da função, tipo de dados, número de dados e ordem das informações.
No que se refere as boas práticas de programação, você deve usar sobrecarga de funções sempre que precisar usar funções com mesmo propósito e mesma lógica, mas para número e/ou tipos e/ou ordem de dados diferentes.
top
ResponderExcluir