Ajude nosso projeto a se manter online.

Acessando membros de Classes e Objetos: private e public

 No tutorial passado de nosso curso, aprendemos como criar classes e objetos em C++. Agora, vamos ver como usar esses conhecimentos, acessando os membros (variáveis e funções) de um objeto/classe.

Acessando membros de Classes e Objetos: .

Ao final de nosso tutorial anterior, tínhamos o código que criava uma classe Quadrado e o objeto 'q'. Faça o seguinte, rode esse código. Obviamente, não aconteceu nada. Definimos uma classe, instanciamos um objeto, e ficou por isso mesmo.

Vamos aprender agora como acessar esses membros dos objetos, através do operador ponto: .
Veja que temos o objeto 'q'. Ele tem a variável 'lado' e a função 'area', que podem ser acessadas:

  • q.lado;
  • q.area();

Basta colocar o nome do objeto, seguido do operador ponto e o nome do membro, definido na classe, igual fazemos com as structs. Vamos criar um programa que define um valor para o lado, e em seguida chama a função area() para printar o valor da área desse quadrado:

#include <iostream>
using namespace std;

class Quadrado
{
    double lado;
    double area();
};

double Quadrado::area()
{
    return lado*lado;
}

int main()
{
    Quadrado q;
    q.lado = 2;
    cout<<"Area: " << q.area() << endl;

    return 0;
}

Rode esse código e veja o resultado. Vai aparecer o erro:
‘double Quadrado::lado’ is private within this context|

Ou seja, tá dizendo que a variável 'lado' é privada! O que é isso? E agora, José?

Especificadores de acesso: public e private

Lembra que, ao falarmos de classe e objetos, dissemos que ele tem um poder especial: de deixar algumas coisas sendo públicas para todo o código e outras coisas privadas, que podem ser acessadas somente por alguns elementos? Pois é, é isso.

Como não definimos como vai ser o acesso desses membros, o C++ colocou eles, por padrão, como private (ou seja, privados).

Como tá tudo privado, somente as membros internos dos objetos podem acessar esses dados. Ou seja, somente uma função do objeto pode acessar e modificar o valor da variável desse objeto.

Mas, queremos acessar essa variável na função main(), uma função de fora, nada a ver com o objeto/classe. Então, precisamos definir esses membros como públicos.

Para isto, basta digitar "public: " antes daquilo que desejamos definir como público, veja como fica nossa classe:

class Quadrado
{
    public:
        double lado;
        double area();
};

Faça essa pequena alteração no seu código, e rode ele. O resultado vai ser:


Ora, se eu defini o lado como tendo valor 2, a área vai ser 2x2=4, está correto!
Veja que maravilha essa orientação a objeto...eu criei um objeto de nome 'q', e ele automaticamente veio com a variável 'lado' e a função 'area()'.

Segurança da informação em Classes e Objetos

Bacana...muito bonito...mas tem um problema aí...essa variável 'lado', ela é visível e acessível a qualquer parte do programa. Imagina se ela faz parte do código da Tesouraria da sua empresa, acharia interessante que alguém de outro setor tivesse acesso a essa variável?
É uma falha de segurança, concorda?

Que tal se somente uma função da classe Quadrado tivesse acesso a variável 'lado'. Faria mais sentido, não é? 

Também faria sentido a variável 'lado' ser privada, ninguém poderia mexer nela fora do escopo do Objeto.

Vamos criar então uma função chamada 'define(double)' que recebe uma variável a seta esse valor pra variável 'lado'.

Nosso código, mais seguro e profissional, vai ficar assim:

#include <iostream>
using namespace std;

class Quadrado
{
    public:
        void define(double);
        double area();
    private:
        double lado;
};

void Quadrado::define(double l)
{
    lado = l;
}
double Quadrado::area()
{
    return lado*lado;
}

int main()
{
    Quadrado q;
    q.define(2);
    cout<<"Area: " << q.area() << endl;

    return 0;
}

Ou seja, agora definimos o valor do lado do quadrado através da função define(), e não mais tendo acesso diretamente a variável 'lado'. Aliás, você pode criar 1 bilhão de objetos agora, não vai ser permitido modificar nem acessar diretamente a variável 'lado' de nenhum deles!

Quer alterar o valor do lado? Pede pra função Quadrado.define()
Quer saber a área daquele quadrado? Pede pra função Quadrado.area()

A comunicação dos objetos com o mundo externo é somente via funções, e isso é muito interessante pois podemos ter um controle maior sobre algumas informações.

Exercício de Orientação a Objetos

1. Você precisa saber o lado de um objeto do tipo Quadrado, crie uma função que retorna o valor do lado desse quadrado, incrementando o código anterior.

2. Ao definir o lado do quadrado, obviamente ele não pode ser 0 ou menos, faça com que a função define() só aceite valores positivos de lado para o quadrado.

Nenhum comentário:

Postar um comentário