Neste tutorial de nossa apostila C++ Progressivo, vamos aprender sobre overloading, ou sobrecarga, da função constructor.
Várias funções construtoras
Você foi contratado por uma universidade para criar um sistema para ajudar os professores, principalmente para trabalhar com as notas dos alunos.
Como você fez o curso C++ Progressivo, vai criar um sistema fantástico, com diversas classes e objetos comendo solto.
Mas vamos com calma.
Vamos criar uma classe de matemática, chamada Math. Pra simplificar, ela vai fazer apenas uma operação: fazer a média de duas notas, de um aluno, só isso.
A função construtor vai dizer logo de cara a média do aluno.
Veja como fica nosso código:
#include <iostream> using namespace std; class Math { public: Math(double, double); }; Math::Math(double g1, double g2) { cout<<"Media: "<<(g1+g2)/2<<endl; } int main() { Math ze(10, 8); return 0; }
Resultado deu 9 certinho, tudo bonito e legal, e o aluno Zé ficou com uma ótima média.
E falando de experiência de mercado, é MUUUUUUITO comum os clientes ficarem pedindo alterações, novas funcionalidades etc. Se acostume, é sempre pedidos e reclamações.
Nesse caso, a universidade agora quer que você calcule a média de 3 notas.
Hora, é muito simples, só adicionar mais um parâmetro na lista da função construtor, criar o objeto com as 3 notas e mandar bala, já era, nosso código fica assim:
#include <iostream> using namespace std; class Math { public: Math(double, double, double); }; Math::Math(double g1, double g2, double g3) { cout<<"Media: "<<(g1+g2+g3)/3<<endl; } int main() { Math ana(10, 9, 10); return 0; }
Tudo certinho e a Ana com média quase perfeita.
Mas aí chega sua universidade e diz: olha, tem aluno que vai fazer duas cadeiras e alunos que vai fazer três cadeiras, ou seja, seu sistema tem que calcular a média em ambos casos.
E agora? Como o construtor vai adivinhar? Uma hora calcula a média dividindo por 2 e no outro exemplo ele dividiu por 3 pois tinha uma variável a mais.
Criar uma classe para cada caso? Claro que não, pois isso é complicação.
Programação foi feito pra tornar o mundo mais fácil! É aí que entra a sobrecarga (overloading) de construidor.
A sobrecarga de Construtores
O C++ tem uma carta na manga: ele te permite criar quantos construtores quiser. Isso mesmo, funções com mesmo nome.
Mas uma coisa tem que ser diferente: a lista de parâmetros.
Exemplo de lista de parâmetros diferentes:
- Math(double, double)
- Math(double, int)
- Math(int, double)
- Math(double, double, double, float, char, int)
- ...
Então, no nosso exemplo das médias, basta criar duas funçoes constructors, uma que recebe duas notas e a outra que recebe três notas:
#include <iostream> using namespace std; class Math { public: Math(double, double); Math(double, double, double); }; Math::Math(double g1, double g2) { cout<<"Media: "<<(g1+g2)/2<<endl; } Math::Math(double g1, double g2, double g3) { cout<<"Media: "<<(g1+g2+g3)/3<<endl; } int main() { Math ze(10, 8); Math ana(10, 9, 10); return 0; }
Veja como o C++ é inteligente. Quando você criou o objeto Zé, só passou dois argumentos, e o objeto invocou a função construidor que só trabalha com dois números.
Quando criou o objeto ana, chamou a outra função construidor, a que trabalha com três valores.
Ou seja, o C++ chama o construtor correto!
Isso é a sobrecarga de construtor.
Agora se você tiver dois construtores com a lista de parâmetros iguais, aí não tem como o C++ adivinhar que função você está querendo invocar, ok?
Vamos aprender um pouco mais sobre sobrecarga quando estudarmos uma classe super especial, a string, que faz loucuras e maravilhas com overloading.
Nenhum comentário:
Postar um comentário