Teoria

E aí pessoal, aqui é o Juan do Responde Aí, e hoje vamos continuar ampliando nossos conhecimentos sobre Programação Orientada a Objetos.

Construindo classes e objetos...

Vamos criar uma classe chamada t r i a n g u l o que tenha três atributos que representam os lados a , b e c , e um método p e r i m e t r o para calcular o perímetro do triângulo.

Note o seguinte, a gente precisou de três linhas de código só pra inserir os valores dos atributos. Se a gente criasse 10 objetos seriam necessárias 30 linhas de código só para setar os atributos, imagina a trabalheira... Seria bem legal se existisse um jeito melhor, né.

E existe sim! São os métodos construtores, funções especiais que são executadas automaticamente no momento que um objeto é criado! Para criar um construtor basta declarar uma função pública com o mesmo nome que a classe sem usar um tipo.

Um detalhe dos construtores é que eles não precisam de um t i p o antes do nome. Além disso não podemos usar uma instrução r e t u r n dentro de um método construtor.

No momento que criamos o objeto devemos inserir os parâmetros do método construtor entre parêntesis. Se o construtor não tiver parâmetros, não colocamos os parêntesis:

Agora no exemplo da classe t r i a n g u l o , vamos criar um construtor:

Observe a adição que fizemos na linha 13: declaramos uma função chamada T r i a n g u l o (o mesmo nome da classe e sem tipo). Nós usamos essa função para receber três valores do usuário, e com esses valores preenchemos os atributos da classe!

E agora observe a linha 22, no momento da criação do objeto t r i nós adicionamos 3 valores entre parêntesis. Estes são os valores passados para o construtor.

Essa é a principal utilidade do construtor: preencher os atributos no momento da criação do objeto

Uma curiosidade sobre os construtores é que eles sempre existem! Até quando não escrevemos um construtor, o compilador automaticamente cria um em branco. Isso acontece, pois métodos construtores são muito importantes para funcionalidades internas do C++.

E é basicamente isso. Fora esses detalhes que acima os construtores funcionam igualzinho a qualquer outro método ou função do C++. Inclusive podem ter parâmetros com valor padrão, e podem ser sobrecarregados também! Mas pra não ter dúvida é só continuar lendo abaixo

Detalhando o uso do método construtor.

Os construtores são funções executadas no momento da criação de um objeto. E isso permite muito mais do que apenas preencher os atributos. Nós podemos executar operações, chamar outras funções, efetuar cálculos, e qualquer outra coisa útil para a nossa classe.

Por exemplo, vamos adicionar algumas funcionalidades dentro do nosso construtor:

A gente expandiu um pouco mais o método construtor, na linha 19 adicionamos um c o u t que vai imprimir a mensagem “Construindo objeto triangulo” sempre que a gente instanciar um objeto. Em seguida, na linha 20, nós executamos o método p e r i m e t r o ( ) e imprimimos o seu valor na tela.

Muito mais coisa pode ser feita dentro do método construtor, você é limitado só por sua imaginação!

Construtor com valores de parâmetro padrão

O processo de adicionar valores padrão em construtores é o mesmo que fazemos com as funções comuns, basta determinar um valor para os parâmetros com o operador = .

Por exemplo, vamos inicializar o construtor da classe t r i a n g u l o com valores padrão:

A única alteração que precisamos fazer está na linha 13 onde definimos o valor 5 como o padrão para as variáveis. Agora, na hora de criar o nosso objeto a gente pode preencher todas as variáveis, como fazemos na linha 25, ou preencher parcialmente, como fazemos nas linhas 26 e 27. Os parâmetros que não foram preenchidos utilizam os valores padrão.

Por exemplo, no triângulo t r i _ 2 definimos que A = 5 e B = 6 , mas como não determinamos o valor de C , o programa usou o valor padrão fazendo C = 5 . Com isso, o perímetro ficou 5 + 6 + 5 = 16 , como vemos na saída. O mesmo vale para t r i _ 3 e t r i _ 4 !

Na linha 28 nenhum valor foi usado para iniciar a o objeto, e nesse caso não devemos usar os parêntesis na hora de criar o objeto. Se você colocar parêntesis vazios, o compilador vai pensar que você está declarando uma função do tipo T r i a n g u l o .

Sobrecarga de métodos construtores

Assim com outros tipos de funções os construtores também podem ser sobrecarregados. Pra efetuar a sobrecarga de um construtor basta você seguir as mesmas regras que usamos para sobrecarregar uma função comum: criamos uma nova função com mesmo nome e com uma quantidade diferente de parâmetros.

Vamos sobrecarregar o construtor da nossa classe t r i a n g u l o :

Na linha 13 nós temos o primeiro construtor que já criamos nos exemplos anteriores, uma função que recebe o valor dos três lados do triângulo, em seguida calcula o perímetro e exibe uma mensagem pro usuário.

Na linha 22 nós criamos um segundo construtor, mas que recebe apenas dois parâmetros, b a s e e a l t u r a . O comportamento dessa função também é diferente, ao invés de calcular o perímetro é calculado a área do triângulo, e uma mensagem diferente é exibida.

Na linha 30 criamos um terceiro construtor que vai trabalhar com triângulos equiláteros, onde o usuário insere o único parâmetro l a d o . E em seguida uma outra mensagem é exibida pro usuário mostrando o valor da variável l a d o

Por fim, nas linhas 40 a 42 nós criamos três objetos diferentes, cada um deles utilizando um construtor diferente.

Boas práticas e evitando erros comuns

  • Não use r e t u r n em um método construtor!
  • Sempre que possível, use um construtor pra garantir que todos os atributos importantes do objeto sejam inicializados.
  • Sempre que for útil, você pode chamar os métodos da classe dentro do construtor.
  • Definir valores padrão para sua classe pode ajudar a evitar erros no seu código.
  • Sobrecarregar o seu construtor pode ser útil, porém, se você criou um construtor que utiliza valores padrão de parâmetro, então evite sobrecarregar esse construtor.
  • Um erro comum é iniciar um objeto sem argumentos usando parêntesis vazios: C l a s s e A   o b j e t o A ( ) . Fazendo isso você está, na verdade, criando uma função chamada o b j e t o A do tipo C l a s s e A .
  • Outro erro comum é criar um construtor p r i v a t e . Existem alguns casos específicos em que isso é possível, mas no geral, pode levar a erros.

Isso é tudo pessoal. Agora vamos dar uma olhada em uns exercícios de fixação.

Detalhando o uso do método construtor.

Boas práticas e evitando erros comuns

Exercícios Resolvidos

Exercício Resolvido #1

Um aluno de engenharia está fazendo um programa em C++ para auxiliá-lo nas aulas de Movimento Retilíneo Uniforme (MRU) em uma dimensão.

Ele criou a seguinte classe:

Ele cometeu alguns erros. Encontre os erros e corrija.

Passo 1

Vamos nessa galera. Essa é uma daquelas questões de analisar códigos, então vamos olhar linha por linha, e encontrar os erros no código.

A chave aqui é perceber o comportamento do programa, e tentar entender como cada linha de código vai se comportar. Então let’s go!

Da linha 01 a 03 é apenas o básico de um programa C++, e está tudo certo por aqui.

Na linha 04 iniciamos a declaração da nossa classe chamada M R U .

Nas linhas 07 e 08 são declarados três variáveis em contexto p r i v a t e para representar a velocidade inicial, e as posições inicial e final. Por enquanto não há nenhum erro aqui.

Em um contexto p u b l i c na linha 12 criamos uma função chamada p o s i c a o _ f i n a l , essa função recebe um parâmetro t e m p o e utiliza os atributos x _ 0 e v _ 0 para calcular o valor do atributo x _ f . Aqui também não encontramos nenhum erro.

Passo 2

Agora vamos pra linha 17 dar uma boa olhada na nossa classe construtora.

O primeiro erro está na linha 17 perceba que o tipo v o i d foi associado a função construtora, porém as funções construtoras não possuem tipo.

O segundo erro também está na linha 17 pois o nome da função está errado, o nome do construtor deve ser igual ao nome da classe.

Seguindo para a linha 19 nos deparamos com uma instrução r e t u r n , e sabemos que as funções construtoras não utilizam esse comando.

Mas olhando a função como um todo, existe um erro ainda mais sério. Um dos principais objetivos da classe construtora é inicializar os atributos da classe, porém, o construtor que foi exibido não atribui os parâmetros aos atributos.

Passo 3

Vamos corrigir os defeitos que encontramos no nosso construtor. Pra começar, a gente deve remover o tipo e renomear o método na linha 17, e apagar o comando de retorno na linha 19:

Em seguida, vamos utilizar esse método para inicializar os atributos x _ 0 e v _ 0 existentes dentro da classe. Pra isso, basta a gente usar o operador = para guardar o valor dos parâmetros nos atributos.

E esse é o nosso método construtor corrigido.

Resposta

Exercício Resolvido #2

Um físico está simulando o comportamento de múltiplos corpos em um espaço tridimensional. Desenvolva uma classe C o r p o onde a classe construtora receba os parâmetros X ,   Y e Z referentes à posição inicial do centro de massa do corpo. Porém, se o objeto for instanciado sem nenhum parâmetro, ele deve ser inicializado no ponto ( 0,0 , 0 )

Passo 1

Fala aí, pessoal. Tudo que vamos precisar desenvolver nessa questão é uma classe! O que é tranquilo, pois não precisamos nos preocupar com as demais partes do programa, então vamos nessa.

O diferencial dessa questão é que o construtor deve ser definido com valores padrão.

Pra começar vamos declarar uma classe chamada C o r p o

Passo 2

Agora vamos definir os atributos da nossa classe. Por questões de segurança o ideal é declarar os atributos como privados.

Em seguida vamos declarar três atributos x , y e z do tipo f l o a t que irão receber os valores de posição do corpo.

Passo 3

O passo seguinte é definir o construtor da nossa classe. Primeiro de tudo, é uma boa prática sempre definir os construtores como públicos. Pra isso usamos o comando p u b l i c

Para declarar o construtor nós sempre fazemos uma função com o mesmo nome da classe e sem tipo (atenção a esse detalhe!).

O construtor vai receber três parâmetros X ,   Y e Z do tipo f l o a t . Eles são definidos dentro dos parênteses à direita do construtor (linha 08). Estou utilizando letras maiúsculas pra não confundir os parâmetros da função com os atributos da classe. A parte interessante dessa questão é que na hora de determinar os parâmetros vamos utilizar o operador = para determinar um valor padrão para cada um dos parâmetros.

O código fica da seguinte forma:

Agora só resta desenvolver o corpo do construtor. Tudo que é necessário fazer é setar os valores dos atributos utilizando os valores inseridos pelo usuário. Veja no código:

E com isso a classe está concluída e finalizamos a questão.

Resposta

Exercício Resolvido #3

Crie uma classe chamada E q u a c a o onde se o construtor receber três parâmetros a , b , c deve-se calcular a solução de uma equação de segundo grau. Se receber dois parâmetros a , b deve encontrar a solução para uma equação de primeiro grau quando a curva cruza o eixo x .

Para fins de teste utilize a = 1 e b = - 3 para a equação de primeiro grau, e utilize a = 1 , b = - 3 e c = 2 para a equação de segundo grau.

Passo 1

Vamos nessa galerinha. O que essa questão está pedindo é pra criarmos uma classe com um construtor sobrecarregado, o primeiro caso considerando uma equação de primeiro grau e no segundo caso consideramos uma equação de segundo grau.

Vamos começar pelo cabeçalho. Para resolver equações de segundo grau vamos precisar incluir a < c m a t h >

Passo 2

Vamos começar a nossa classe chamada E q u a ç ã o . Pra começar vamos declarar os atributos da classe.

Todos os atributos estarão privados para garantir a integridade dos dados. Vamos precisar de três atributos a , b e c para receber os coeficientes das equações. Note que o atributo c só será utilizado quando a equação tiver grau 2.

Também vamos declarar dois atributos x 1 e x 2 que conterão os resultados da equação. Da mesma forma, o atributo x 2 só será usado nas equações de segundo grau

Passo 3

Vamos desenvolver um método c a l c _ g r a u 1 ( ) do tipo v o i d que calcula o valor de x quando a reta cruza o eixo das abscissas. Na linha 10 usamos um c o u t para exibir a equação para o usuário. Na linha 13 calculamos a raiz da equação e guardamos o resultado no atributo x 1 . Para concluir, na linha 14 usamos o c o u t para exibir o resultado pro usuário.

Vamos criar um segundo método c a l c _ g r a u 2 do tipo v o i d que calcula a equação de segundo grau. Na linha 19 utilizamos a instrução c o u t para exibir a equação para o usuário.

Na linha 22 calculamos o valor de Δ , note que declaramos uma nova variável dentro da função, pois ela só deve existir durante o cálculo.

Em seguida, usamos uma instrução i f - e l s e para determinar quando é impossível obter soluções reais ( Δ < 0 ) ou quando é possível obter soluções reais ( Δ ≥ 0 ) .

No primeiro caso, usamos o c o u t para informar o usuário. No segundo caso efetuamos os cálculos para encontrar as raízes, e exibimos os resultados.

Passo 4

Agora vamos pro coração da questão e desenvolver nossos métodos construtores.

Primeiro de tudo, precisamos mudar o contexto da classe de privado para público utilizando o p u b l i c

Precisamos definir um construtor para o caso de um objeto que recebe três valores no momento de sua criação. Começamos criando uma função sem tipo com o mesmo nome da classe, e que receba três parâmetros: A ,   B e C . Usaremos letras maiúsculas para não confundir com os atributos que definimos nos passos anteriores.

Em seguida, no corpo do construtor vamos utilizar os valores recebidos para setar os atributos da classe.

Com os valores dos atributos definidos, podemos chamar a função c a l c _ g r a u 2 para efetuar o calcula e exibir os resultados pro usuário.

Seguindo os mesmos princípios, vamos criar uma sobrecarga para o construtor. Vamos criar uma segunda função sem tipo chamada E q u a c a o mas que, desta vez, receba apenas dois parâmetros.

Da mesma forma, usaremos os valores recebidos para preencher os atributos da classe. Em seguida, vamos chamar o método c a l c _ g r a u 1 para efetuar os cálculos.

E isso conclui a nossa classe.

Passo 5

Antes de finalizar a questão, vamos executar os testes com os valores sugeridos pela questão:

Primeiro vamos criar um objeto chamado e q 1 que calcule uma equação de primeiro grau com os valores 1 e - 3 . E um segundo objeto chamado e q 2 que calcule uma equação de segundo grau com os valores 1 , - 3 e 2

O resultado é:

Resposta

Exercício Resolvido #4

Crie uma classe para os empregados de uma empresa. Eles devem ter os atributos privados n o m e e s a l a r i o , que devem ser inicializados no momento que o objeto é instanciado.

Em seguida, crie um vetor que contenha 4 objetos dessa classe, e através desse vetor, imprima o nome e o salário de cada funcionário.

Passo 1

Vamos lá, galera.

A questão quer que a gente crie uma classe que represente os funcionários e depois crie um vetor com quatro funcionários.

Como iremos ter um atributo n o m e , será útil inserir a classe < s t r i n g > para facilitar nossa vida.

Passo 2

Vamos construir a classe chamada E m p r e g a d o s , e criamos os atributos privados n o m e do tipo s t r i n g , e s a l a r i o do tipo f l o a t

Em seguida, vamos pro contexto público da nossa classe e vamos desenvolver o construtor. Criamos uma função sem tipo com o mesmo nome da classe, e esta função receberá os parâmetros N o m e e S a l a r i o .

No corpo do construtor, vamos guardar os parâmetros recebidos nos atributos da classe.

Mas lembre-se que a questão quer que a gente imprima o n o m e e s a l a r i o de cada funcionário. Porém, estes são atributos privados, então antes de fechar a classe, vamos criar um método que imprima esses atributos

Criamos então o método v o i d   I m p r i m e F u n c i o n a r i o ( ) que consiste apenas em usar um c o u t para imprimir um texto com nome e salário.

Ok, a classe está pronta.

Passo 3

Em seguida vamos para a função principal do programa.

Aqui termos que criar uma array que contenha 4 empregados. Mas pode surgir a seguinte dúvida: “Como inserir os parâmetros do construtor?”

É simples, jovem gafanhoto, a gente cria uma array do tipo da classe, e usando as chaves vamos instanciar quatro objetos dentro desse vetor simplesmente chamando o nome da classe e abrindo parênteses para colocar parâmetros do construtor:

Então vamos criar um vetor chamado l i s t E m p r e g com 4 funcionários. Preencha os campos com os nomes e salários que você quiser 😊

Show de bola. Agora precisamos imprimir o nome e salário de todos os funcionários. Então vamos fazer o seguinte, vamos criar um loop e iterar em cima da lista l i s t E m p r e g , e pra cada iteração vamos executar o método I m p r i m e F u n c i o n a r i o (   )

E é isso! O código está pronto. 👌

Resposta

Exercício Resolvido #5

Crie uma classe círculo com os métodos d e s l o c a r que desloca o centro do círculo em x e y , a u m e n t a r que aumenta o raio do círculo, e i m p r i m i r que mostra as informações do círculo. Crie um construtor que defina os dados iniciais do círculo (raio e centro). Os atributos da classe devem ser privados.

Passo 1

E aí galerinha!

Essa questão está pedindo pra gente criar uma classe que represente um círculo. O detalhe é que ela quer que a gente deve incluir um método construtor no desenvolvimento dessa classe.

Dando uma olhada no enunciado, e a gente vai ter que criar mais três métodos: d e s l o c a r , a u m e n t a r e i m p r i m i r . O método deslocar modifica a posição x , y do círculo, o método aumentar modifica o tamanho do raio, e o método imprimir mostra as informações do círculo. Todos esses métodos devem estar disponíveis para uso, então devem ser públicos.

Pensando um pouco na descrição desses métodos, podemos dizer que vamos precisar de três atributos: um para a posição no eixo x, outro para posição no eixo y e um terceiro para representar o raio.

Mas antes de começar a codificar, vamos escrever o cabeçalho do código:

Passo 2

Show de bola. Vamos começar a nossa classe!

Primeiro declaramos uma classe chamada C i r c u l o :

Dentro dessas classes vamos criar os atributos três atributos privados. Os atributos x e y para representar a posição, e o atributo r para representar o raio. Os três atributos podem ser quaisquer números reais, então vamos declarar como float.

Beleza, atributos criados, vamos agora pros métodos. Essa classe vai possuir quatro métodos públicos: o método construtor, e os métodos d e s l o c a r , a u m e n t a r e i m p r i m i r .

Pra criar um construtor é só você lembrar que um construtor é um método sem tipo com o mesmo nome da classe. Então vamos declarar o construtor:

Por enquanto, vamos apenas declarar o construtor, por isso botamos um ponto-e-vírgula no final da linha 09.

Agora vamos declarar os demais métodos, d e s l o c a r , a u m e n t a r e i m p r i m i r .

E com todos os métodos declarados podemos fechar a classe!

Passo 3

Beleza, o esqueleto da classe está concluído! Agora precisamos desenvolver o comportamento dos métodos! Então vamos definir cada um dos métodos. Pra gente definir um método fora da classe é bem fácil, é só fazer assim:

Vamos começar definindo o construtor. Pra isso vamos chamar o construtor fora da classe. O construtor vai receber como parâmetro os valores de cada um dos atributos. E dentro do método construtor vamos inicializar os atributos da classe com os valores dos parâmetros recebidos.

O próximo passo é definir o método d e s l o c a r . Esse método vai receber como parâmetro um valor de deslocamento para cada uma das componentes. E dentro desse método vamos atualizar os atributos x e y para adicionar o valor de deslocamento.

Seguindo em frente, vamos desenvolver o método a u m e n t a r . Esse método vai receber como parâmetro um valor de proporção, e dentro do método vamos multiplicar o valor do raio por essa proporção.

O último método que precisamos desenvolver é o i m p r i m i r , que não precisa receber nenhum parâmetro. Dentro desse método vamos apenas usar o c o u t para imprimir uma mensagem com todos os atributos da classe:

E com isso a gente termina de desenvolver os métodos da classe! A classe está prontinha!

Passo 4

Show de bola. Agora é só a gente testar a classe.

Vamos instanciar um objeto da classe C i r c u l o . Lembre-se que essa classe tem um construtor, então, no momento que criamos um objeto temos que usar os parêntesis para passar os parâmetros do construtor:

Em seguida, vamos executar alguns métodos, e rodar o código:

O resultado é:

Resposta

Exercício Resolvido #6

Defina uma classe que representa um círculo com métodos privados que calcula a área, a distância entre os centros de dois círculos, e a circunferência do círculo.

O círculo deve ser iniciado no momento que for instanciado por um conjunto de construtores:

Passo 1

E aí pessoal, vamos lá?!

Essa é claramente uma questão de sobrecarga de construtor!

A questão está pedindo pra gente criar uma classe que possui três métodos privados e um construtor com 3 sobrecargas.

Vamos começar desenvolvendo o cabeçalho da questão. Nessa questão vamos precisar calcular áreas, distancias e perímetros, então vamos incluir o cabeçalho < c m a t h > pra auxiliar a gente.

Passo 2

Então vamos começar declarando a classe C i r c u l o

Vamos precisar declarar três atributos: x e y para representar a posição central, e o r a i o para representar o raio do círculo. Além disso, ao longo dos métodos vamos precisar do valor de π , então vamos declarar uma constante com o valor.

Depois vamos precisar declarar métodos privados que calcula a área do círculo, calcular a distância entre os centros de dois círculos, e a circunferência do círculo. Vamos declarar então três métodos: a r e a , d i s t a n c i a e c i r c u n f e r e n c i a . Por enquanto vamos apenas declarar os protótipos dos métodos, a gente vai desenvolver eles depois.

Continuando a nossa classe, vamos desenvolver os construtores. Lembre-se os construtores são sempre públicos (com raras exceções). Então vamos mudar para p u b l i c e criar o construtor.

Nessa questão, temos sobrecarga de construtores então vamos declarar todas as sobrecargas do nosso construtor. A primeira versão não recebe nenhum parâmetro

A segunda versão do construtor irá receber o valor do raio:

A terceira versão recebe o valor da posição x e y

E a última versão do construtor recebe os três parâmetros:

Está quase tudo pronto, mas tem um pequeno detalhe. Todos os atributos e métodos interessantes são privados! Precisamos criar um método público que imprima as informações dessa classe. Então vamos criar o método i m p r i m i r :

E agora sim a gente pode fechar a classe.

Passo 3

Dentro da classe a gente declarou o protótipo dos métodos, agora a gente precisa desenvolver o conteúdo desses métodos. Para desenvolver um método fora da classe a gente chama o método usando e dentro das chaves escreve o conteúdo do método.

t i p o   N o m e C l a s s e ∷ N o m e M e t o d o     p a r a m e t r o s   {   c o n t e u d o   }

Primeiro, vamos começar pelo método a r e a ( ) . Ele é bem simples, não precisa receber nenhum parâmetro. Apenas vai acessar o atributo r a i o e aplicar a fórmula da área do círculo:

a r e a = π ⋅ r a i o 2

Depois vamos desenvolver o método d i s t a n c i a . Esse método é interessante por recebe um outro objeto da classe C i r c u l o ! Dentro desse método, a gente calcula a distancia entre as componentes do círculo, e depois calcula o módulo dessa distância, e retorna esse resultado:

Δ x = x r e c e b i d o - x d a C l a s s e

Δ y = y r e c e b i d o - y d a C l a s s e

d i s t a n c i a = Δ x 2 + Δ y 2

No código fica assim:

O próximo método que vamos desenvolver é o c i r c u n f e r e n c i a que calcula o comprimento da circunferência usando a seguinte fórmula:

2 π ⋅ r a i o

E já vamos aproveitar para desenvolver o método i m p r i m i r também. É só usar o c o u t várias vezes para imprimir os atributos e métodos da classe:

Passo 4

Agora vamos desenvolver os construtores. Vamos lembrar que um construtor é um método sem tipo e que não retorna nada. Na maioria das vezes esse método é usado apenas para inicializar os atributos da classe, e é exatamente isso que faremos aqui.

Para evitar confusão entre os nomes dos parâmetros e dos atributos, vamos usar o ponteiro t h i s quando a gente quiser se referir aos atributos da classe.

O primeiro construtor não recebe nenhum parâmetro, e inicializa os atributos com valores padronizados.

O segundo construtor recebe o valor do raio, e inicializar os atributos:

O construtor três recebe os parâmetros x e y :

E o último construtor recebe o valor de todos os parâmetros da classe:

E prontinho! Desenvolvemos todas as sobrecargas do construtor, e a classe está terminada!

Passo 5

Pra terminar a questão, precisamos testar o nosso código!

Vamos criar quatro instâncias da classe círculo, e em cada uma delas a gente vai utilizar uma construtor diferente!

E depois, em cada instância vamos utilizar o método i m p r i m i r :

E aí termos o seguinte resultado:

Resposta

Exercício Resolvido #7

Defina uma classe que representa um retângulo com métodos privados que calcula a área o perímetro do retângulo. Crie um construtor para esse retângulo que receba a altura e a largura, e que caso nenhum valor seja inserido inicialize a largura e altura com valor 1 .

Passo 1

E aí, tudo beleza?!

Essa questão pede pra gente criar uma classe para representar um retângulo. Um detalhe é que a questão pede um construtor com valores padronizados.

Vamos precisar declarar dois atributos a l t u r a e l a r g u r a , que por questões de boas práticas de programação, serão privados. E também vamos desenvolver dois métodos privados a r e a ( ) e p e r i m e t r o ( ) .

Porém, essa classe não tem nenhuma forma de exibir seus atributos e métodos. Então vamos criar um método i m p r i m i r ( ) que mostra os atributos e cálculos da classe.

Vamos começar desenvolvendo o cabeçalho da questão.

Passo 2

Vamos agora desenvolver a classe R e t a n g u l o

E em seguida vamos declarar seus atributos:

O passo seguinte é declarar os protótipos dos métodos! Primeiro vamos declarar os protótipos dos métodos privados a r e a ( ) e p e r i m e t r o ( ) . Esses dois métodos não precisam receber parâmetros, e retornam valores reais.

Depois a gente muda para o p u b l i c e declaramos o protótipo do construtor, que não tem tipo, e recebe dois parâmetros.

E por fim, declaramos o protótipo do método i m p r i m i r ( )

E podemos fechar a classe.

Passo 3

Agora vamos desenvolver cada um dos métodos da classe! Para desenvolver um método fora da classe a gente chama o método usando e dentro das chaves escreve o conteúdo do método.

t i p o   N o m e C l a s s e ∷ N o m e M e t o d o     p a r a m e t r o s   {   c o n t e u d o   }

Primeiro, vamos desenvolver o construtor. Como já definimos, o nosso construtor vai receber dois parâmetros. O detalhe é que esses parâmetros tem valores padrão. Caso não seja fornecido valores, o construtor irá usar o 1 como padrão.

Para criar um método com valor padrão é só a gente usar o operador = v a l o r do lado dos parâmetros do método.

Dentro do construtor vamos inicializar os atributos a l t u r a e l a r g u r a com os valores inseridos pelo usuário.

Passo 4

Seguindo em frente, vamos desenvolver os demais métodos da classe.

O método a r e a ( ) vai simplesmente retornar o valor da multiplicação a r e a × a l t u r a :

O método p e r i m e t r o ( ) também é tranquilo de desenvolver. Ele simplesmente vai retornar o valor da soma de todos os lados do retângulo, que podemos calcular assim:

2 × ( a l t u r a + l a r g u r a )

E pra gente acessar os valores dos atributos e os resultados dos métodos, vamos desenvolver o método i m p r i m i r ( ) . Utilizando o c o u t vamos exibir na tela o valor dos atributos e o resultado dos cálculos:

E prontinho! A classe e seus métodos estão concluídos!

Passo 5

Agora é só a gente testar tudo.

Vamos criar três instancias de R e t a n g u l o , cada uma delas vai inserir uma quantidade diferente de parâmetros no construtor, pois como o construtor possui valores padrão, os parâmetros não fornecidos serão preenchidos com o valor padrão 1 .

Depois, em cada objeto, vamos executar o método i m p r i m i r  

Rodando o código vamos ter o seguinte resultado:

E prontinho! Está tudo funcionando direitinho!

Resposta