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…