Médio C++
Classe Retangulo com construtor e this
Enunciado
Crie uma classe Retangulo com membros privados double largura e double altura. Forneça um construtor que recebe largura e altura como parâmetros e usa this para atribuir aos membros. Adicione métodos públicos area() e perimetro(). No main, crie dois retângulos, imprima a área e o perímetro de cada um.
Requisitos
- Os membros
larguraealturadevem serprivate. - O construtor deve usar
this->para diferenciar parâmetros dos membros. - Os métodos
area()eperimetro()devem ser públicos econst. - A saída deve mostrar os valores corretos para dois retângulos.
Código inicial
#include <iostream>
class Retangulo {
// complete aqui
};
int main() {
// crie dois retângulos e imprima area e perimetro
return 0;
}
Saída esperada
Retangulo 1: area = 12, perimetro = 14
Retangulo 2: area = 20, perimetro = 18
Ver dica
No construtor, use this->largura = largura; para o parâmetro não esconder o membro.
Mostrar solução
#include <iostream>
class Retangulo {
private:
double largura;
double altura;
public:
// Construtor usa this para diferenciar membros dos parâmetros
Retangulo(double largura, double altura) {
this->largura = largura;
this->altura = altura;
}
// Calcula a área
double area() const {
return largura * altura;
}
// Calcula o perímetro
double perimetro() const {
return 2 * (largura + altura);
}
};
int main() {
Retangulo r1(3.0, 4.0);
Retangulo r2(5.0, 4.0);
std::cout << "Retangulo 1: area = " << r1.area()
<< ", perimetro = " << r1.perimetro() << "\n";
std::cout << "Retangulo 2: area = " << r2.area()
<< ", perimetro = " << r2.perimetro() << "\n";
return 0;
}
Passo a passo
- A classe
Retangulotem dois membrosprivate:larguraealtura. - O construtor recebe parâmetros com os mesmos nomes dos membros, criando ambiguidade.
- Usamos
this->largura = largura;para deixar claro que o membro da esquerda é o da classe e o da direita é o parâmetro. - O método
area()retornalargura * altura; éconstpois não altera o objeto. - O método
perimetro()retorna2 * (largura + altura). - No
main, criamos dois objetos com valores diferentes e imprimimos seus resultados.
Por que funciona
O this é um ponteiro implícito para o objeto que chamou o método. Dentro do construtor, this->largura acessa o membro da classe, enquanto largura (sem this) refere-se ao parâmetro. Isso resolve a ambiguidade de nomes e é uma prática idiomática em C++.
Erros comuns
- Esquecer
this->no construtor:largura = largura;atribui o parâmetro a ele mesmo, deixando o membro sem valor.
O correto éthis->largura = largura;. - Não marcar os métodos como
const: eles não modificam o objeto, então devem serconstpara permitir chamadas em objetos constantes. - Usar
floatem vez dedoublesem necessidade: pode causar perda de precisão. Prefiradouble.
Outra forma de resolver
Usar lista de inicialização no construtor, que é mais eficiente e evita a ambiguidade:
Retangulo(double largura, double altura) : largura(largura), altura(altura) {}
Isso é preferível quando os membros são inicializados diretamente, sem atribuições no corpo.
Saída esperada
Retangulo 1: area = 12, perimetro = 14
Retangulo 2: area = 20, perimetro = 18