Atributos e Métodos

Ver Todos os Exercícios

Teoria

Introdução

Eai, tudo bem?

Nessa aula nós vamos prosseguir com os fundamentos da orientação a objetos. A seguir, nós vamos compreender mais sobre as ferramentas usadas para caracterizar um objeto e como isso é abstraído na POO, desde as propriedades desse objeto até o que ele pode realizar.

Então vamos nessa!

Atributos de uma classe

Imagine que você foi contratado para programar um jogo em C++. Uma das coisas que acontecem nesse jogo, é que o jogador pode controlar uma moto. Para que isso seja possível, você precisa programar todas as características da sua moto, ou seja, se ela é uma moto rápida ou devagar, o tamanho dela, se ela está ligada ou desligada, etc.

Para programar isso, vamos criar uma classe   m o t o , onde vamos especificar tudo sobre as motos desse jogo. Então bora lá!

Inicialmente, vamos criar a classe:

O nosso próximo passo seria colocar as características das motos desse jogo no nosso código. Na programação orientada a objetos, essas características são chamadas de atributos. Na prática, um atributo será uma variável que guardará um valor que está atrelada a uma característica da classe.

Para começarmos a declarar os atributos dessa foto, vamos pensar o que queremos dela e como podemos colocar isso na forma de atributos. Algumas características básicas que podemos pensar de uma moto é a sua velocidade e o seu estado (ou seja, se ela está ligada ou desligada). Então vamos passar isso para o nosso código:

Basicamente, o que fizemos aqui foi declarar os atributos dessa classe que criamos, e isso é feito da mesma maneira que declaramos as variáveis. Perceba que declaramos os atributos com valores iniciais. Na prática, isso significa que, sempre que instanciarmos um objeto dessa classe, ele vai ter esses valores para os seus atributos, ou seja, todas as motos vão possuir velocidade máxima de 80, assim como está na linha 4, e ela estará parada e desligada, por isso as variáveis b l i g a d a e b m o v i m e n t a n d o foram inicializadas com f a l s e .

Mas é possível que modifiquemos o nosso código para que possamos alterar os valores que inicializamos, ou seja, para que possamos instanciar motos com diferentes velocidades máximas, estando já ligada ou já em movimento. Vamos entender melhor sobre isso com os métodos de uma classe.

Métodos de uma classe

Além de possuir atributos, precisamos definir o que um objeto de uma classe pode fazer com esses atributos. Isto é, quais são as ações que esse objeto pode fazer? Para a programação orientada a objetos, essas ações são os métodos de uma classe. Esses métodos serão funções que declaramos dentro da nossa classe. Essas funções podem usar os atributos da classe, além de poder modificá-los.

Para a nossa classe m o t o , é interessante que tenhamos métodos para ligar e desligar a moto, além de podermos alterar a sua velocidade máxima. Pensando nisso, vamos criar 3 métodos para essa classe.

Criarmos os métodos é o mesmo que declararmos funções dentro da nossa classe. Agora, vamos programar o que os nossos métodos fazem. Uma boa maneira de fazermos isso de tal modo que o nosso código fique organizado, é especificarmos o que cada método faz fora da região das chaves que delimita a classe. Mas como o compilador sabe que essa função é na verdade um método da classe m o t o e não uma função global? Para isso, o C++ usa uma sintaxe específica.

Para que possamos, fora da região da classe, especificar o que um método faz, usamos a seguinte sintaxe:

É bem semelhante ao que já fazemos com funções, a diferença é que incluímos o nome da classe antes do nome da função e separamos os dois usando “::”.

Vamos brincar um pouco com essa estrutura e definir o que os nossos métodos fazem.

Iniciando com o método D e f i n i r V e l o c i d a d e M a x i m a . Vamos modificar o valor do Atributo V e l o c i d a d e M a x i m a para o valor que será recebido na função e vamos imprimir esse valor na tela.

Importante: os atributos de uma classe são acessíveis para os métodos das classes sem precisar passarmos eles como parâmetros.

Dessa forma, nós temos:

Agora vamos definir o método l i g a r . Esse método deve modificar o estado da moto de desligada para ligada, ou seja, deve alterar o valor da variável b l i g a d a de f a l s e para t r u e . Caso a moto já esteja ligada, simplesmente imprimir na tela a mensagem indicando que a moto está ligada.

Por fim, vamos definir o método d e s l i g a r . De forma semelhante ao anterior, ele deve checar se a moto está ligada ou desligada e a desligar em caso positivo.

Com isso, nós já definimos os atributos e os métodos da nossa classe. Agora vamos ver como utilizamos eles após instanciarmos um objeto.

Notação ponto

Para acessarmos os métodos e atributos da nossa classe fora da região interna a ela, existem duas notações possíveis. A primeira que veremos é a notação ponto, mas antes disso, vamos acrescentar uma linha de código que tornará possível acessarmos os métodos da nossa classe:

Basicamente, ao escrevermos p u b l i c : na linha 12, torna-se possível acessar os métodos que estão abaixo da linha 12. Por enquanto, não vamos nos aprofundar muito nesse comando, apenas tenha em mente que ele possui essa função,

Vamos inicializar a nossa função m a i n e vamos instanciar um objeto da nossa classe. Por uma questão de organização, vamos iniciar a nossa função m a i n em outro arquivo . c p p . Para que possamos usar o código que criamos nesse novo arquivo, vamos fazer uma inclusão. Para isso, vamos salvar o código feito com o nome moto.cpp e vamos abrir um novo arquivo .cpp na mesma pasta.

Perceba que, para incluir o código que fizemos, foi utilizado o header # i n c l u d e   " m o t o . c p p " .

Agora, vamos usar a notação ponto para acessarmos o método D e f i n i r V e l o c i d a d e M a x i m a e colocarmos a velocidade limite da nossa moto em 150 usando a notação ponto.

Perceba que a notação ponto apresenta a seguinte sintaxe:

N o m e D o O b j e t o . N o m e D o M e t o d o p a r a m e t r o s ;

Bem semelhante a acessarmos uma função, mas nesse caso temos que colocar o objeto antes para indicar que a função que queremos acessar é, na realidade, um método da classe ao qual o objeto pertence.

Nós podemos fazer isso para os demais métodos que definimos:

Ou seja, nesse caso, nós mudamos a velocidade máxima da nossa moto, ligamos ela e depois a desligamos. Isso nos daria a seguinte saída:

Mas, se instanciássemos dois objetos da mesma classe, ao modificarmos o valor de algum atributo de um, o mesmo seria alterado para o outro?

A resposta para essa pergunta é não. Qualquer instanciar um objeto, ele vem com todas as informações iniciais que estão declaradas na sua classe. Ou seja, dois objetos, mesmo que pertençam a mesma classe, são objetos distintos.

Notação flecha

O segundo tipo de notação que usaremos é a notação flecha. Ela é utilizada quando declaramos um ponteiro que aponta para o local de memória do objeto. Para declararmos esse ponteiro, basta usarmos a notação:

C l a s s e     * p o n t e i r o ;

Então, ao invés de usarmos o objeto, vamos fazer esse ponteiro apontar para o local de memória de um objeto instanciado e usaremos ele para acessarmos os métodos da classe m o t o . É possível fazer isso usando o * para indicar que estamos nos referindo ao objeto armazenado no local da memória no qual o ponteiro está guardando.

Porém, se torna muito não prático sempre precisarmos acrescentar ( *   ) . Pensando nisso, utiliza-se o operador seta para simplificar o nosso trabalho:

Com isso, nós podemos acessar os métodos utilizando o ponteiro que aponta para o local de memória do nosso objeto.

Agora que já compreendemos mais sobre os atributos e métodos da programação orientada a objetos, nós podemos começar as nossas questões de fixação! Então bora lá!

Métodos de uma classe

Exercícios Resolvidos

Exercício Resolvido #1

Explique o que são os atributos e os métodos de uma classe no contexto da programação orientada a objetos.

Passo 1

Fala aí, tudo beleza?

Na programação orientada a objetos, uma classe é uma forma de abstrairmos algo concreto, que seria um objeto. Nessa classe, nós fazemos um molde para a criação desses objetos. Para que isso seja possível, devemos saber quais são as características desse tipo de objeto e armazená-las em variáveis próprias dessa classe, que seriam os atributos, e quais são as ações possíveis de serem realizadas por esse objeto para desenvolvermos funções próprias dessa classe para realiza-las, o que seriam os métodos.

Ou seja, os atributos são as características e os métodos são as ações.

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #2

Explique como acessamos um método de uma classe fora do seu escopo usando a notação ponto.

Passo 1

Eai, tudo beleza?

Nessa questão, nós temos que utilizar a notação ponto, que é um tipo de notação utilizada para acessar informações de uma classe, para utilizarmos um método de uma classe estando fora do seu escopo.

Antes de tentarmos acessar esse método, precisamos garantir algumas coisas. Se não estamos usando o mesmo arquivo . c p p no qual essa classe foi criada, precisamos incluir esse arquivo no nosso código. Para isso, usamos o seguinte comando:

Ou

Dependendo de onde esse arquivo está salvo.

Passo 2

O próximo passo é instanciarmos um objeto da classe que estamos usando. Isso pode ser feito da seguinte forma:

Por fim, nós utilizamos a notação ponto para acessarmos um método dessa classe:

Para exemplificar isso, vamos supor que estamos criando um objeto da classe P e s s o a que possui o método a n d a r que recebe um valor inteiro para representar a distância a ser andada em metros. Nesse caso, podemos acessar esse método faríamos:

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #3

Finalize a implementação de uma moto. Adicione ao seguinte código o atributo v e l o c i d a d e que deverá conter a velocidade instantânea da moto. Além disso, faça os métodos acelerar e desacelerar que deverão incrementar ou diminuir em 10 a velocidade da moto e imprimir o valor da velocidade na tela.

Passo 1

Eai, tudo tranquilo?

Nessa questão, nós teremos que modificar o código dado, criando um novo atributo e dois novos métodos. Os novos métodos, a c e l e r a r e d e s a c e l e r a r , deverão modificar os atributos de v e l o c i d a d e e b m o v i m e n t a n d o .

Vamos começar as modificações no código declarando o atributo v e l o c i d a d e e os métodos a c e l e r a r e d e s a c e l e r a r dentro do escopo da classe m o t o .

Perceba que iniciamos o atributo v e l o c i d a d e com valor 0 , para ser coerente com os demais, ou seja, como a moto normalmente inicia desligada e parada, faz sentido a sua velocidade inicial seja 0 .

Passo 2

Agora, vamos implementar o método a c e l e r a r . Vamos começar utilizando um i f para checar se a moto está ligada. Caso ela esteja, vamos checar se, caso acelerarmos, ela ainda vai estar dentro da velocidade aceitável. Caso ambos sejam verdade, vamos incrementar a velocidade da moto.

Após isso, vamos checar a condição do atributo b m o v i m e n t a n d o , para sabermos se a moto já estava movimentando ou estava parado. Se ela já estivesse se movimentando, vamos somente imprimir na tela o seu novo valor. Caso ela esteja parada, vamos mudar o valor do atributo b m o v i m e n t a n d o e imprimir na tela que agora ela está se movimentando e a sua velocidade.

Caso incrementássemos a velocidade da moto e ela ultrapassasse a velocidade limite, vamos fazer ela ser igual a velocidade limite.

Por fim, vamos considerar o caso da moto estar desligada e vamos imprimir uma mensagem dizendo que precisamos ligá-la primeiro.

Passo 3

Vamos implementar o método d e s a c e l e r a r . Assim como o método a c e l e r a r , vamos iniciar checando se a moto está ligada. Caso ela esteja ligada, vamos checar se ela está se movimentando e, em caso positivo, vamos checar se diminuíssemos a velocidade dela em 10, ela ainda estaria se movimentando. Isso serve para evitarmos uma velocidade negativa. Em caso positivo, vamos reduzir a sua velocidade e imprimir na tela.

Após isso, vamos checar se a velocidade da moto agora é nula. Se for, vamos mudar o estado de b m o v i m e n t a n d o para f a l s e .

Agora, vamos considerar o caso de, se desacelerarmos a moto em 10 e a sua velocidade ficar negativa. Nesse caso, vamos fazer a sua velocidade ser nula, mudar o valor do atributo b m o v i m e n t a n d o e imprimir na tela que a moto parou.

Por fim, vamos acrescentar os casos dela não estar se movimentando e já está desligada.

Resposta

Exercício Resolvido #4

Você já jogou algum RPG? Se sim, você deve estar acostumado com o conceito de ficha de personagem. A ficha de personagem é onde são colocadas todas as informações sobre um personagem, como a sua história, suas características físicas e os seus atributos.

Implemente uma ficha de personagem simplificada. Ela deve conter os atributos v i d a , f o r c a , d e s t r e z a e i n t e l e c t o , além de um quinto atributo chamado de p o n t o s . Todos os atributos devem iniciar com o valor 5. Faça também dois métodos: o m o s t r a r _ a t r i b u t o s , que deve imprimir na tela os valores dos atributos, e o d i s t r i b u i r _ p o n t o s , que deve receber como argumentos os valores que devem ser aumentados em cada atributo (exceto o atributos p o n t o s ). Os valores passados para o método d i s t r i b u i r _ p o n t o s devem ter soma máxima de 5 e devem subtrair o valor de p o n t o s , ou seja, será como se esse atributo p o n t o s estivesse sendo distribuído nos demais.

Passo 1

Fala aí, tudo tranquilo?

Nessa questão, vamos criar uma classe para implementar o sistema de ficha de personagem. Vamos chamar essa classe apenas de P e r s o n a g e m . Vamos colocar os atributos e as classes assim como descrito no enunciado. Como valores negativos não fazem sentido nessa situação, vamos declarar os atributos e as variáveis recebidas nos parâmetros como do tipo u n s i g n e d   i n t .

Perceba que no método d i s t r i b u i r _ p o n t o s , definimos os parâmetros iniciando com um p , isso serve para que saibamos, ao escrever o código, que ele se refere a uma quantidade de pontos que será distribuída.

Passo 2

Vamos agora escrever o método d i s t r i b u i r _ p o n t o s . Vamos começar checando se a quantidade de pontos passados é maior do que a quantidade de pontos disponível. Caso isso seja verdade, vamos imprimir uma mensagem indicando que a quantidade de pontos passados para o método é inválida.

Agora, caso esses pontos sejam válidos, vamos distribuí-los e reduzi-los da quantidade de pontos disponíveis.

Passo 3

Por fim, vamos fazer o método m o s t r a r _ a t r i b u t o s . Nele, vamos imprimir na tela o valor de cada atributo indicando o que ele é.

Resposta

Exercício Resolvido #5

Implemente um carro. O tanque de combustível do carro armazena no máximo 50 litros de gasolina. O carro consome 15 km/litro. Deve ser possível:

  • Abastecer o carro com uma certa quantidade de gasolina;
  • Mover o carro em uma determinada distância (medida em km);
  • Retornar a quantidade de combustível e a distância total percorrida.

Passo 1

Eai, tudo beleza?

Nessa questão vamos implementar um carro usando POO. Para isso, vamos definir os atributos c a p a c i d a d e , para guardar o valor limite da gasolina no tanque do carro, c o n s u m o , que armazena o consumo do carro em km/l, g a s o l i n a , que salva a quantidade de gasolina atual do carro, e a d i s t a n c i a _ t o t a l , para armazenar a quantidade total que o carro já andou.

Além disso, vamos ter como métodos a b a s t e c e r , para abastecermos o carro de acordo com a quantidade de gasolina que iremos passar como parâmetro, m o v e r , para movimentarmos o carro de acordo com o parâmetro passado, d i s t _ t o t a l , que retorna o parâmetro d i s t a n c i a _ t o t a l , e c o m b u s t i v e l , que retorna o parâmetro g a s o l i n a .

Perceba que todos os atributos e parâmetros declarados foram do tipo f l o a t . Isso foi só um meio de evitarmos c a s t no nosso código, pois teremos divisão com valores que nem sempre serão múltiplos.

Passo 2

Vamos implementar o método a b a s t e c e r . Primeiramente, vamos checar se o valor passado como parâmetro é válido. Caso seja um valor negativo, vamos imprimir na tela que esse valor é inválido. Caso ele ultrapasse a capacidade do tanque, vamos imprimir uma mensagem falando isso. Caso seja um valor válido, vamos incrementar o valor de gasolina.

Passo 3

Agora, vamos incrementar o método mover. Primeiro, vamos criar uma variável para guardar o valor da distância máxima que o carro pode mover com a gasolina que ele possui.

Vamos fazer uma análise semelhante a feita no método anterior. Vamos checar se o valor passado como parâmetro é válido. Primeiramente, vamos checar se ele é negativo, caso seja, imprimiremos uma mensagem informando isso. Depois, vamos checar se a distância passada excede a limite. Por fim, se o valor for válido, vamos incrementar a distância total e vamos reduzir na gasolina o valor que foi gasto.

Passo 4

Por fim, basta fazermos as funções que retornam o valor da distância total percorrida e o valor da gasolina:

Resposta

Exercício Resolvido #6

Crie uma classe chamada S a l a D e A u l a . Essa classe deve possuir os seguintes atributos:

  • cadeiras – número inteiro que representa a quantidade total de cadeiras na sala;
  • alunos – quantidade de alunos em sala;
  • aula – um booleano que diz se está tendo aula (true) ou não (false).

essa classe também deve ter os métodos do tipo void:

  • EntrarAluno
  • SairAluno
  • ComecarAula
  • TerminarAula

Obs: Apenas desenvolva a estrutura da classe. Não é necessário especificar o que cada método faz.

Passo 1

Eai, tudo beleza?

Nessa questão nós vamos estruturar uma classe chamada S a l a D e A u l a com os atributos e métodos descritos.

Vamos começar declarando a classe e os seus atributos: c a d e i r a s , a l u n o s e a u l a :

Perceba que, assim como descrito no enunciado, c a d e i r a s e a l u n o s são tipo i n t e a u l a é do tipo b o o l .

Passo 2

Vamos para os métodos, que, como foi dito no enunciado da questão, serão do tipo v o i d . Vamos declará-los como p u b l i c , para torná-los acessíveis, e encerrar a nossa classe.

Resposta

Exercício Resolvido #7

Faça uma implementação que simule um cliente de um restaurante. Cada objeto da classe c l i e n t e deve possui como atributo uma quantidade de dinheiro, além de um atributo b c o m e n d o do tipo boolean para indicar se ele está comendo ou não.

Nessa classe deve haver os métodos de comer e parar de comer, que alteram o valor do atributo b c o m e n d o e imprimem na tela uma mensagem dizendo se o cliente está comendo ou não. Além disso, crie um método para pagar a conta, onde um valor que será passado como parâmetro representa o preço que foi gasto em comida. Cada cliente inicia com 100 reais e o valor da conta é subtraído dessa quantia.

Passo 1

Eai, tudo beleza?

Vamos criar uma classe para simular um cliente de um restaurante. Para isso, comecemos declarando a classe com os atributos d i n h e i r o , do tipo double e com valor inicial 100 , e b c o m e n d o , do tipo bolean com o valor inicial f a l s e .

Além disso, vamos declarar os métodos descritos no enunciado:

Passo 2

Vamos especificar o que cada método faz, começando pelo método c o m e r . Primeiramente, vamos checar o valor do parâmetro b c o m e n d o para saber se o cliente já está comendo. Em caso negativo, vamos mudar o valor de b c o m e n d o para t r u e e imprimir uma mensagem dizendo que o cliente começou a comer, mas em caso positivo, vamos apenas imprimir uma mensagem indicando que ele já está comendo.

O processo que ocorre no método p a r a r D e C o m e r é bem semelhante. Vamos checar o valor se o cliente está comendo, em caso positivo, mudamos o valor de b c o m e n d o e imprimimos uma mensagem indicando que o cliente parou de comer. Em caso negativo, apenas imprimimos uma mensagem indicando que ele não está comendo.

Passo 3

Por fim, vamos para o método p a g a r . Nele, vamos comparar o valor recebido como parâmetro com o dinheiro do cliente. Se esse valor, que representa a conta, for maior que o valor salvo em d i n h e i r o , vamos imprimir uma mensagem indicando que o saldo do cliente é insuficiente.

Em caso contrário, vamos subtrair o valor da conta do dinheiro do cliente e vamos imprimir na tela que a conta foi paga.

Resposta

Exercício Resolvido #8

Um Arduino é um microcontrolador que é programado em C++. Ele possui algumas funções prontas, como a d i g i t a l W r i t e , que envia 0 ou 5 volts para uma de suas portas lógicas, o que pode ser utilizado para desligar ou ligar um componente eletrônico, e a função d e l a y , que recebe um número inteiro e faz com que o sistema apresente uma pausa durante o tempo que foi passado a ela em milissegundos. Veja o código abaixo que é utilizado para ligar um led.

O código que está na dentro da função v o i d   s e t u p ( ) é lido somente uma vez, nele é definido se algum pino do Arduino será de saída ou de entrada. A função v o i d   l o o p ( ) ficará sendo repetida até que o Arduino seja desligado. Nela, há um código que faz com que o Arduino Arduino faça um led ficar piscando.

Pensando nisso, crie uma classe   L e d para abstrair parte do código acima. Essa classe deve possuir como parâmetros o número do pino ao qual o led está ligado, que deve iniciar com valor 5, e o tempo em milissegundos que será utilizado no d e l a y . Além disso, essa classe deve possuir os métodos d e f i n i r _ p i n o , que deve receber um valor e passar para o parâmetro pino levando em consideração que, para a aplicação que será realizada, poderão ser utilizados os somente os pinos do 4 até o 9, e p i s c a r _ l e d , que deverá fazer um led piscar no mesmo padrão do código apresentado.

Passo 1

Eai, tudo beleza?

Primeiramente, vamos entender o passo a passo do código que nos foi passado. Ele inicia definindo uma constante chamada LED e atribui o valor 5:

Após isso, ele no v o i d   s e t u p , ele declara o pino 5 como saída.

Agora, no v o i d   l o o p , onde fica o código que será repetido até o Arduino ser desligado, ele declara uma variável t e m p o e atribui o valor 1000 a ela na linha 9. Esse valor deve é passado para função d e l a y , que trabalha em milissegundos, ou seja, esse tempo representa 1000 milissegundos, que seria equivalente a 1 segundo. Na linha 12, ele liga o led utilizando a função d i g i t a l W r i t e e, logo em seguida, usa a função d e l a y para fazer o sistema esperar 1 s . Por fim, ele desliga o led na linha 14 e, na linha 15, ele faz outro delay.

Portanto, o led vai ficar ligado por 1 s e depois desligado por 1 s , e seguirá esse padrão para piscar até que o Arduino seja desligado.

Passo 2

Agora que já compreendemos o código fornecido, vamos criar a nossa classe l e d . Como foi especificado no enunciado, vamos iniciar os parâmetros t e m p o e p i n o com valores 1000 e 5 , respectivamente.

Vamos também declarar os métodos d e f i n i r _ p i n o , que vai receber um i n t como parâmetro, e o método p i s c a r _ l e d .

Passo 3

Agora, vamos definir o que cada método faz. No caso do método d e f i n i r _ p i n o , vamos analisar se o parâmetro passado é um valor disponível para a aplicação, ou seja, se ele está entre 4 e 9 . Em caso positivo, vamos passar esse valor para o atributo p i n o .

No caso do método p i s c a r _ l e d vamos colocar a rotina de ligar o led, esperar 1s, desligar o led e esperar 1s.

Resposta