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 largura e altura devem ser private.
  • O construtor deve usar this-> para diferenciar parâmetros dos membros.
  • Os métodos area() e perimetro() devem ser públicos e const.
  • 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

  1. A classe Retangulo tem dois membros private: largura e altura.
  2. O construtor recebe parâmetros com os mesmos nomes dos membros, criando ambiguidade.
  3. Usamos this->largura = largura; para deixar claro que o membro da esquerda é o da classe e o da direita é o parâmetro.
  4. O método area() retorna largura * altura; é const pois não altera o objeto.
  5. O método perimetro() retorna 2 * (largura + altura).
  6. 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 ser const para permitir chamadas em objetos constantes.
  • Usar float em vez de double sem necessidade: pode causar perda de precisão. Prefira double.

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