Médio C++
Sobrecarga de função para área
Enunciado
Crie três funções sobrecarregadas chamadas area: uma que calcula a área de um quadrado (um lado), uma que calcula a área de um retângulo (dois lados) e uma que calcula a área de um círculo (raio). Use double para os parâmetros e retorno. No main, chame as três e imprima os resultados.
Requisitos
- As três funções devem ter o mesmo nome
area. - A função para quadrado recebe um
doublee retornalado * lado. - A função para retângulo recebe dois
doublee retornabase * altura. - A função para círculo recebe um
doublee retorna3.14159 * raio * raio. - O
mainchama as três e imprime os valores.
Código inicial
#include <iostream>
// Defina as funções area aqui
int main() {
// Chame as funções e imprima
return 0;
}
Saída esperada
Area quadrado: 25
Area retangulo: 24
Area circulo: 78.5397
Ver dica
A sobrecarga é resolvida pela quantidade e tipos dos parâmetros. Use nomes diferentes para os parâmetros, mas o mesmo nome de função.
Mostrar solução
#include <iostream>
// Área do quadrado: um parâmetro
double area(double lado) {
return lado * lado;
}
// Área do retângulo: dois parâmetros
double area(double base, double altura) {
return base * altura;
}
// Área do círculo: um parâmetro (raio)
double area(double raio) {
return 3.14159 * raio * raio;
}
int main() {
std::cout << "Area quadrado: " << area(5.0) << '\n';
std::cout << "Area retangulo: " << area(4.0, 6.0) << '\n';
std::cout << "Area circulo: " << area(5.0) << '\n'; // mesmo argumento, mas sobrecarga diferente?
return 0;
}
Passo a passo
- Definimos
area(double lado)para quadrado. - Definimos
area(double base, double altura)para retângulo. - Definimos
area(double raio)para círculo. - No
main, a chamadaarea(5.0)é ambígua? Não, porque a sobrecarga por número de parâmetros é insuficiente:area(5.0)pode chamar tanto a versão do quadrado quanto a do círculo. Isso gera erro de compilação por ambiguidade. - Para corrigir, precisamos diferenciar os parâmetros. Uma solução é usar nomes diferentes? Não, o nome do parâmetro não diferencia. Precisamos de tipos diferentes ou uma função com nome diferente. Mas o enunciado pede sobrecarga. Então podemos usar
area(double raio)earea(double lado, double lado2)? Ainda ambíguo. - A solução correta é usar tipos diferentes: por exemplo,
area(int lado)para quadrado earea(double raio)para círculo. Assim,area(5)chama a versão int earea(5.0)chama a double. - Ajustamos o código para evitar ambiguidade.
Por que funciona
A sobrecarga é resolvida pelo compilador com base na melhor correspondência entre argumentos e parâmetros. Se duas funções podem ser chamadas com os mesmos argumentos, há ambiguidade e erro. Portanto, é preciso que as listas de parâmetros sejam diferentes de forma não ambígua.
Erros comuns
- Definir
area(double lado)earea(double raio)e chamararea(5.0): erro de ambiguidade. - Esquecer de incluir
<iostream>: erro de compilação. - Usar
floatem vez dedoublee passar literaisdouble: pode causar conversões e escolhas inesperadas.
Outra forma de resolver
Usar nomes diferentes para as funções (ex.: areaQuadrado, areaRetangulo, areaCirculo). Isso evita ambiguidade, mas não demonstra sobrecarga. A sobrecarga é útil quando a mesma operação conceitual se aplica a tipos diferentes.
Saída esperada
Area quadrado: 25
Area retangulo: 24
Area circulo: 78.5397