Encapsulamento que em programação orientada a objetos significa separar o programa em partes, o mais isoladas possível. A idéia é tornar o software mais flexível, fácil de modificar e de criar novas implementações. Objetos restringem a visibilidade de seus recursos (atributos e métodos) aos outros usuários. Todo objeto tem uma interface, que determina como os outros objetos podem interagir com ele. A implementação do objeto é encapsulada, isso é, invisível ou visível fora do próprio objeto.
Public – Quando precede uma lista de membros de classe, o públic palavra-chave especifica que esses membros são acessíveis a partir de qualquer função. Isso se aplica a todos os membros declarados até o próximo especificador de acesso ou o fim da classe. Ou seja visível a todos.
Private – Quando precede uma lista de membros de classe, o private palavra-chave especifica que esses membros são acessíveis somente dentro de funções de membro e amigos da classe. Isso se aplica a todos os membros declarados até o próximo especificador de acesso ou o fim da classe. Ou seja visível somente para membros dentro da classe.
Protected – O protected palavra-chave especifica o acesso a membros de classe no lista de membros até o próximo especificador de acesso (pública ou private) ou no final da definição de classe. O Protected é mistura entre Public e Private ou seja é visível somente para membros da classe e visível para subclasses.
Publico VS Private
- Publico todas as classes podem usar os métodos e campos.
- Privado apenas a classe podem usar os métodos e campos.
Por que Controlar o Acesso?
- Proteger informação privada.
- Esclarecer como outros programadores devem usar sua classe.
- Manter a implementação separado da interface.
Exemplo:
imagine o seguinte cenário, temos uma classe que é responsável por transações de cartões de credito geralmente este tipo de classe pertence a companhia de cartões de credito e foi desenvolvida por um outro programador e esta dentro de uma DLL ou OS, acontece que o desenvolvedor terceirizado cometeu um deslize deixando visível a propriedade numero do cartão. Um desenvolvedor malicioso pode facilmente capturar o numero do cartão referenciando o objeto.
Neste exemplo você deve brincar com o código fonte a fim de resolver o problema de controle de acesso , use CTRL+espaço após a classe para ver a visibilidade de acesso dos métodos e campos.
C++
Classe #1 – Principal
#include "stdafx.h" #include <iostream> #include <string> #include "cartaocredito.h" using namespace std; void metodoMalicioso(CartaoCredito& cartao) { cartao.gastos = 0; cout << "Seu numero de cartão: " << cartao.numeroCartao; } int _tmain(int argc, _TCHAR* argv[]) { // Uma transação hipotetica CartaoCredito transacao; transacao.cobranca("3453 3636 0001 1267", 350.00); // Metodo malicioso Injeta um gasto valor de 0 e imprime o numero do cartão metodoMalicioso(transacao); cout << endl; system("pause"); return 0; }
Classe #2 – Cartão de Credito
#include "stdafx.h" #include <iostream> #include <string> using namespace std; class CartaoCredito { // Esta declaração esta errada // Deste modo é possive capturar o numero do cartão // A classe expos o numero para que seja acessivel de outra classe // para não expor os numero use private // private: public: string numeroCartao; double gastos; //public: void cobranca(string nCartao, double valor) { numeroCartao = nCartao; gastos = gastos + valor; } CartaoCredito() { } };
Melhor explicação qu encontrei na web…