Membros Públicos e Privados

Ver Todos os Exercícios

Teoria

Introdução

Fala, tudo tranquilo?

Dando continuidade na nossa jornada em Programa Orientada a Objetos, no tópico de hoje nós vamos falar dos membros públicos e privados de uma classe.

Vamos entender também o que é o encapsulamento, pra que serve, como e quando o usamos no nosso código.

Tá preparado? Então vamos nessa!

Membros Públicos

Imagina que você foi contratado para programar o sistema de cadastro de funcionários de uma empresa. Pensando nisso, você resolveu usar os seus conhecimentos em C++ e POO para criar uma classe f u n c i o n a r i o que possua todos os atributos e métodos necessários para fazer o cadastro do funcionário.

Vamos supor que as informações necessárias para o cadastro de um funcionário sejam o seu nome, um número inteiro que seria o seu ID e o cargo desse funcionário, que pode ser “RH”, “vendedor”, “estagiário” e “gerente”.

Vamos precisar também de um método chamado d a d o s , que irá imprimir na tela os dados de um funcionário.

Nesse código nós criamos a classe f u n c i o n a r i o e colocamos os atributos necessários para criarmos o cadastro de um funcionário e fizemos o método para imprimir os seus dados.

No entanto, esse código tem um problema. Se tentarmos acessar algum atributo ou método dessa classe fora do código classe, vai ocorrer um problema. Por exemplo, se salvarmos esse arquivo com o nome “funcionário.cpp”, criarmos outro arquivo .cpp na mesma pasta e fizermos a inclusão do arquivo com a classe, não conseguiremos acessar nada dela:

Se tentarmos rodar esse código, haverá um erro de compilação, indicando que esse método não está acessível.

Para consertarmos isso, nós podemos escrever o seguinte comando na linha 9:

Ao utilizarmos o comando public:, nós tornamos todos os atributos e métodos abaixo dele públicos, ou seja, passa a ser possível acessá-los fora do código da classe.

Com isso, podemos acessar os atributos e métodos dessa nossa classe no outro arquivo que criamos usando a notação ponto:

Nesse código, nós estamos basicamente acessando cada atributo desse objeto e colocando um valor para ele. Ao fim, nós acessamos o método d a d o s e imprimimos os valores dos atributos. Perceba que, tanto para os métodos quanto para os atributos, usamos a notação ponto para acessá-los.

Para esse código, teremos a seguinte saída:

Membros Privados

Algo que é importante de entendermos sobre o código que fizemos é que, ao tornamos todos os atributos públicos, nós demos a liberdade de que qualquer usuário desse código modifique os valores dos atributos pro que ele quiser, inclusive algo errado.

Por exemplo, seria possível instanciar um objeto onde o cargo seja algo inexistente:

Esse código irá rodar normalmente, mesmo que estejamos colocando um valor que não faça o menor sentido para o objetivo do nosso código, tendo a seguinte saída:

Para contornarmos esse problema, o C++ permite que tornemos parte do código de nossa classe público (acessível) e parte dele privado (inacessível fora do código fonte da classe).

Para isso, usamos o comando private:

Ao utilizarmos esse comando, fazemos com que tudo que esteja após o private e antes do comando de public seja algo privado, que não pode ser acessado fora do código fonte da classe.

O processo de dividir o nosso código em membros públicos e privados é o que chamamos de encapsulamento. O que serve para separar o programa em partes deixando nosso software mais flexível.

Public, Private e as boas práticas de programação

O próximo problema no nosso código é que agora não podemos modificar o valor do atributo c a r g o . Para resolvermos isso, vamos criar um método para modificar esse valor. Dentro desse método nós vamos checar se os casos para fazermos com que o atributo c a r g o receba um valor coerente. Primeiramente, vamos declarar o método r e g i s t r a r _ c a r g o na região do código da classe.

Agora, vamos especificar o que esse método faz. Iniciaremos checando se o valor passado como parâmetro é algum dos valores aceitos como cargos da empresa. Casa sim, vamos fazer o atributo c a r g o receber o valor, e, em caso negativo, fazermos com que cargo admita o valor " e s t a g i a r i o " como padrão.

O processo de tornar privado um parâmetro que possa dar algum erro no nosso código e usarmos um método para que possamos tratar o valor recebido para que ele seja coerente com o que precisamos no nosso código é uma boa prática de programação. Dessa forma, não podemos fazer com que o usuário utilize o nosso código da melhor forma possível.

Uma outra boa prática de programação é deixarmos sempre explícito quais membros são privados e quais são públicos dentro do nosso programa, pois, no C++, caso não especificarmos, ele admite que o membro é privado por convenção.

Mas como sabemos quando colocar um elemento como privado ou público no nosso código?

Isso é algo que vai depender muito da aplicação que estamos fazendo. Precisamos entender bem o que queremos fazer com o programa, as variáveis, os atributos e os métodos que estamos programando nele para sabermos qual será a melhor decisão.

Normalmente, quando há alguma possibilidade do usuário passar valores que não fazem sentido ou quando há algum atributo que, ao ser modificado, pode causar algum problema ao código escrito, é recomendado que estes fiquem privados.

Quando algum atributo ou método pode ser acessado sem causar problema ao restante do código, mantê-lo público pode ser uma opção viável. E, por fim, há o caso de precisarmos deixar o membro como público, que normalmente ocorre com métodos que precisam ser acessados para que o programa cumpra o seu objetivo.

Agora, vamos aplicar os conhecimentos adquiridos para resolver as questões de fixação. Então bora lá!

Membros Públicos

Membros Privados

Public, Private e as boas práticas de programação

Exercícios Resolvidos

Exercício Resolvido #1

Explique o que é o encapsulamento para a programação orientada a objetos e a sua utilidade.

Passo 1

Eai, tudo beleza?

Para o Programação Orientada a Objetos, o processo de encapsulamento é um meio de separar o nosso código definindo membros privados e públicos. Ao definirmos um membro como privado, estamos impossibilitando que alguém o acesse de fora da região onde está o código da classe. Quando definimos um membro como público, permitimos que ele seja acessado.

Essa separação no nosso código, ao ser bem utilizada, melhor a estruturação do nosso código e torna o nosso software mais seguro e dinâmico, permitindo que o usuário o utilize da melhor maneira possível.

Resposta

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

Exercício Resolvido #2

Ana foi contratada para programar um sistema de cadastro de filmes de uma plataforma online. Para cadastrar um filme, são necessárias duas informações: o título do filme e a sua classificação indicativa. No sistema dessa plataforma, todos os filmes devem possuir o título começando com letra maiúscula e as classificações indicativas que podem estar no cadastro são “Livre”, “10 anos”, “12 anos”, “16 anos” e “18 anos”.

Sabendo disso, Ana resolveu implementar esse sistema de cadastro em C++ e, para isso, criou uma classe f i l m e conforme está no código abaixo.

Comente o fato de Ana ter decidido colocar os atributos t i t u l o e c l a s s i f i c a c a o como privados e as classes d e f i n i r T i t u l o e d e f i n i r C l a s s i f i c a c a o .

Passo 1

Eai, tudo beleza?

Nessa questão, devemos estudar o código que nos foi fornecido e analisar o uso de p r i v a t e e p u b l i c nele.

Perceba que, de acordo com o que nos foi fornecido de informação pelo enunciado, existem algumas condições para os valores a serem armazenados em t i t u l o e em c l a s s i f i c a c a o durante o cadastro de um filme. Vamos pensar na situação em que esses atributos foram colocados como públicos. Nesse caso, seria possível colocar qualquer valor admissível para uma string neles, o que não estaria de acordo com o sistema da plataforma.

Ou seja, deixar esses a t r i b u t o s privados e criar m e t o d o s públicos que podem analisar, filtrar e ajustar os valores passados é um meio melhor de atribuir valores para esses atributos. Portanto, Ana está corretíssima no que fez.

Resposta

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

Exercício Resolvido #3

Um aluno que está aprendendo C++ criou dois arquivos .cpp na mesma pasta e escreveu os seguintes códigos em cada um deles:

Ao tentar rodar o segundo código, o aluno foi surpreendido com a mensagem de um erro. Sabendo que o arquivo com o primeiro código se chama gato.cpp, explique qual foi o erro do aluno e como você o consertaria.

Passo 1

Eai, tudo beleza?

Nessa questão devemos encontrar o erro do código que nos foi apresentado. Para isso, é necessário que entendamos o que está escrito nesses códigos.

No primeiro código, a classe gato é criada e é passado para ela um atributo f a l a , que recebe uma string “miau”, e um método m i a r , que imprime na tela o valor guardado no atributo f a l a .

No segundo código, é incluído o código do primeiro. Dentro da função m a i n , é instanciado um objeto da classe g a t o com o nome g a r f i e l d e, logo em seguida, é chamado o método m i a r e logo em seguida é encerrada a função m a i n .

Passo 2

É importante que direcionemos a nossa atenção para a tentativa de acesso ao método m i a r na linha 7 do segundo código. Para que fosse possível acessarmos esse método, ele precisa ser público, no entanto, no primeiro código, não é especificado quais membros são públicos e quais são privados.

Quando isso não é especificado, no C++, é admitido, por convenção, que esses membros são do tipo privado, o que explica o motivo do erro que ocorre ao tentar executar o segundo código.

Passo 3

Para consertarmos esse erro, basta explicitarmos quais membros devem ser privados e públicos. No caso desse código, seria suficiente para consertar o erro deixarmos o atributo privado e o método público.

Resposta

O segundo código está tentando acessar um membro privado do primeiro código. Para consertar isso, é preciso tornar esse membro público.

Exercício Resolvido #4

Um programador iniciante foi desenvolver um sistema de cadastro de clientes de uma loja. Essa loja precisa de 3 dados para realizar o cadastro: o nome, a idade e o cpf. O programador resolveu então criar uma classe c l i e n t e na qual cada atributo seria um dado necessário para o cadastro do cliente.

O programador, por não ter tanto conhecimento em POO, acreditou que seria uma boa opção deixar todos os atributos da sua classe para acesso público, de forma que fosse mais fácil de acessar esses atributos.

Descreva possíveis erros que podem acontecer no cadastro de um cliente por causa dessa escolha do programador e comente uma possível melhoria nesse código.

Passo 1

Eai, tudo tranquilo?

Nessa questão, vamos analisar o código dado, comentar os seus erros e pensar em maneira de melhorar esse código.

Quando definimos um atributo como público, estamos dando livre acesso a ele fora do nosso código fonte. Isso significa que, quem for usufruir dessa classe, poderá modificar à vontade o valor dos atributos. Isso permitia que valores que, na prática, não possuem significado para nós poderiam ser passados para esses atributos, como uma idade negativa ou um cpf inválido.

Portanto, tornar esses membros públicos para que eles possam ser modificados mais facilmente foi uma péssima escolha.

Passo 2

Uma maneira na qual poderíamos melhorar esse código é tornando privado esses elementos e criando métodos (que poderiam ser públicos) para passar os valores para esses atributos. Como um método para verificar se o cpf recebido é válido e um método para analisar se o valor da idade é um valor coerente.

Resposta

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

Exercício Resolvido #5

Definir uma classe que represente um círculo.Esta classe deve possuir métodos Privados para:

  1. calcular a área do círculo;
  2. calcular a circunferência do círculo.

E métodos Públicos para:

  1. definir o raio do círculo, dado um número real;
  2. imprimir o valor do raio;
  3. imprimir o valor da área do círculo;
  4. Imprimir a o valor da circunferência do círculo.

Passo 1

Eai, tudo tranquilo?

Nessa questão nós vamos implementar um círculo. Para isso, vamos utilizar os métodos definidos especificados no enunciado. Como todos esses métodos estão relacionados com valores do raio, da área ou da circunferência do círculo, podemos definir esses elementos como atributos privados.

Dessa forma, podemos criar a nossa classe da seguinte forma:

Passo 2

Vamos especificar o que cada um de nossos métodos faz, começando pelos métodos privados. Ambos precisam calcular o valor de algum atributo, considerando que já seja conhecido o valor do raio. Para o cálculo da área, usamos π r 2 , enquanto para o cálculo da circunferência, usamos 2 π r . Vamos utilizar o valor de pi como 3,14159 nas nossas contas.

Agora, vamos especificar um dos métodos públicos: o d e f i n i r R a i o . Nele, iremos primeiramente checar se o valor passado como parâmetro é maior ou igual a 0. Em caso positivo, vamos passar esse valor para o r a i o , mas em caso negativo, vamos imprimir uma mensagem na tela indicando que deve ser passado um atributo de valor positivo.

Passo 3

Por fim, vamos para os métodos que devem imprimir os valores. O primeiro, i m p r i m i r R a i o , deverá simplesmente usar o comando c o u t para imprimir o valor do r a i o na tela.

Os métodos p r i n t A r e a e p r i n t C i r c u n f e r ê n c i a deverão chamar os métodos privados c a l c u l a r A r e a e c a l c u l a r C i r c u n f e r e n c i a , respectivamente, e somente depois imprimir os valores na tela.

Resposta

Exercício Resolvido #6

Implemente um sistema de conta numa rede social por meio de uma classe chamada c o n t a . Cada conta deve possui um login e uma senha que, por padrão, iniciarão com os valores padrão “meulogin” e “Segredo”. Essa classe deve possui o método d e f i n i r L o g i n e d e f i n i r S e n h a , que deverão pedir para o usuário digitar o valor atual do login ou da senha e, caso a senha digitada seja a correta, será possível definir um valor novo para o login ou para a senha.

Passo 1

Eai, tudo beleza?

Nessa questão vamos implementar um sistema de login e senha bem simples focando nos métodos para modificar o login e a senha. Vamos inicialmente incluir as bibliotecas necessárias e declarar a nossa classe c o n t a .

Pensando na segurança do nosso código, devemos deixar os atributos l o g i n e s e n h a como privados, para que eles só possam ser modificados por meio dos métodos, que serão públicos.

Passo 2

Agora, vamos escrever o código dos nossos métodos. Primeiramente, o método d e f i n i r L o g i n . Nele, vamos declarar a variável l o g i n _ a t u a l para receber o login que o usuário vai digitar. Após passarmos o valor pra essa variável (linha 22), vamos usar os condicionais para saber se o valor passado é igual ao valor que está armazenado em l o g i n . Em caso negativo, vamos imprimir uma mensagem indicando que o login digitado está errado e, em caso positivo, vamos pedir para o usuário digitar um novo login e vamos salvá-lo no parâmetro l o g i n .

Passo 3

Por fim, vamos escrever o método d e f i n i r S e n h a . Ele será semelhante ao método anterior. Faremos o mesmo processo de pedir para que o usuário digite a sua senha atual e vamos passar esse valor para a string s e n h a _ a t u a l . Depois, vamos testar se esse valor é valido ou não e, em caso positivo, vamos pedir para que o usuário defina uma nova senha.

Resposta

Exercício Resolvido #7

Crie a classe P r o f e s s o r . Essa classe deve possuir os seguintes membros privados:

  • ID – código de identificação do professor, inicia com valor 0.
  • Materia – matéria que o professor da aula, inicia com “matematica”.

Como membros públicos, ela deve possuir:

  • DefinirID – função que vai receber como parâmetro um número inteiro e, caso ele esteja entre 0 e 2000, vai fazer a variável ID receber esse valor.
  • DefinirMateria - – função que vai receber como parâmetro um string e vai checar se esse string é igual a “matemática”, “portugues” ou “historia” e, em caso for igual a algum desses, vai passar o seu valor ao parâmetro M a t e r i a .
  • Lecionar – imprime na tela a mensagem: “O professor esta dando aula de ______”. No lugar do espaço é o valor armazenado em M a t e r i a .

Passo 1

Eai, tudo beleza?

Nessa questão nós temos que fazer uma implementação de uma classe P r o f e s s o r com um encapsulamento no qual os seus atributos são privados e os seus métodos são públicos.

Vamos começar o nosso código declarando a classe com os atributos e métodos descritos. Como o valor do ID varia de 0 até 2000, uma opção é declararmos ele como um u n s i g n e d   i n t enquanto M a t e r i a será declarado como uma string.

Passo 2

A seguir, vamos definir os métodos, começando pelo D e f i n i r I D . Nele, vamos checar se o valor recebido como parâmetro está entre 0 e 2000 e, em caso positivo, vamos passar o seu valor para o atributo I D .

Para o método D e f i n i r M a t e r i a , vamos checar se a string recebida é igual a algumas das opções disponíveis, se ela for, vamos passar o seu valor para o parâmetro M a t e r i a .

Passo 3

Por fim, vamos fazer o método L e c i o n a r . Nele, imprimir na tela uma mensagem com a matéria que está armazenada no atributo M a t e r i a :

Resposta

Exercício Resolvido #8

Faça uma classe chama P o n t o 2 D , essa classe deve representar um sistema de coordenadas em duas posições e deve possuir valores de coordenadas x e y como membros privados. Ela deve possuir os métodos c r i a r P o n t o , que recebe dois valores e os passa para os atributos no caso deles estarem no primeiro quadrante, e i m p r i m i r P o n t o que deve imprimir os valores das coordenadas no formato (   x   ,   y   ) .

OBS: Os valores das coordenadas devem ser representados com números reais.

Passo 1

Eai, tudo beleza?

Nessa questão, nós vamos fazer uma simples implementação de uma classe para representar um sistema de coordenadas 2D.

Vamos, inicialmente, declarar a nossa classe P o n t o 2 D com os parâmetros privados x e y , e os métodos públicos c r i a r P o n t o e i m p r i m i r P o n t o .

Passo 2

Agora, vamos definir o método c r i a r P o n t o . Nele, vamos checar se os valores passados estão no primeiro quadrante, ou seja, se ambos os valores são positivos. Caso sejam, vamos atribuir os seus valores aos parâmetros x e y .

Passo 3

Agora, vamos definir o método i m p r i m i r P o n t o . Nele, vamos imprimir os valores das coordenadas no padrão (   x   ,   y   ) :

Resposta