Especificadores de acesso C ++

Especificadores de acesso C ++
Em C ++, uma classe é um conjunto de variáveis ​​e funções que foram configuradas para trabalhar juntas. Quando as variáveis ​​da classe recebem valores, um objeto é obtido. Um objeto tem as mesmas variáveis ​​e funções que uma classe, mas desta vez, as variáveis ​​têm valores. Muitos objetos podem ser criados a partir de uma classe. Um objeto difere de outro objeto de acordo com o conjunto diferente de valores atribuídos às variáveis ​​do outro objeto. Diz -se que criar um objeto de uma classe está instanciando o objeto. Mesmo que dois objetos diferentes tenham os mesmos valores para suas variáveis, esses objetos são entidades diferentes, identificadas por nomes diferentes no programa. As variáveis ​​para um objeto e sua classe correspondente são chamadas de membros de dados. As funções de um objeto e sua classe correspondente são chamadas de funções de membro. Membros de dados e funções membros são chamados de membros.

A palavra acesso significa ler ou alterar o valor de uma variável e também significa usar uma função. Especificadores de acesso a C ++ são as palavras "privado", "protegido" e "público.Eles decidem se um membro pode acessar outros membros de sua classe, ou se uma função ou operador fora da classe e não pertencer à classe pode acessar qualquer membro da classe. Eles também decidem se um membro de uma aula derivada (criança) pode acessar um membro da classe dos pais.

O conhecimento básico do C ++ é necessário para entender este artigo e testar o código fornecido.

Conteúdo do artigo

  • Os especificadores públicos e privados
  • O especificador protegido
  • Especificadores de classe derivados e especificadores de membros
  • Conclusão

Os especificadores públicos e privados

Aula
Qualquer membro de uma classe pode acessar qualquer outro membro da mesma classe, independente da qual é rotulado como "público" ou "privado.”Considere o seguinte programa:

#incluir
usando namespace std;
CLASSE THECLA

privado:
int num1;
int num2;
público:
Thecla (int n1, int n2)

num1 = n1; num2 = n2;

Método int ()

retornar num1;

;
int main ()

Thecla obj (10, 20);
int no2 = obj.método();
cout<// int no1 = obj.num1;
retornar 0;

A saída é 10. Os membros privados são num1 e num2. Os membros públicos são thecla () e métodos (). Observe que o TheCla () é a função do construtor que inicializa variáveis ​​de interesse. A região de um especificador de acesso começa de seu rótulo até o final da descrição da classe (definição) ou para o início de outro especificador de acesso.

Na função Main (), a primeira afirmação é a instanciação envolvendo a função do construtor, que inicializa o num1 e num2. A próxima declaração chama o membro público, Method (), da classe.

Agora, na descrição da classe (definição), a função do membro público, thecla (), acessa os membros privados, num1 e num2. Além disso, a função do membro público, Method (), acessa o membro privado, num1. Qualquer membro da descrição de uma classe pode acessar qualquer outro membro na mesma descrição da classe; não importa qual membro é privado ou público.

No entanto, uma função ou operador não declarado na descrição da classe e fora da descrição da classe pode acessar apenas membros públicos da classe. A função principal (), por exemplo, é uma função declarada fora da descrição da classe. Foi capaz de acessar apenas o método () e os membros públicos thecla (). Dentro da função main (), a função thecla () é obj (10, 20).

Uma função externa ou operador externo, como a função principal (), não pode acessar nenhum dos membros privados da classe, como num1 ou num2. Remova o indicador de comentários, // da instrução Last-But-One em Main (). Se você tentar compilar o programa, observe que o programa não será compilado, dando uma mensagem de erro.

Especificador padrão
O especificador padrão para uma aula é “privado.”Então, a descrição da classe acima é a mesma da descrição a seguir, privada, mas sem o especificador:

CLASSE THECLA

int num1;
int num2;
público:
Thecla (int n1, int n2)

num1 = n1; num2 = n2;

Método int ()

retornar num1;

;

Observação: O rótulo do especificador de acesso começa com o especificador e é seguido por um cólon.

O especificador protegido

Dentro de uma descrição de classe e de uma função ou operador externo, o especificador protegido é o mesmo que o especificador privado. Agora, substitua o especificador privado no programa acima com o especificador, proteja e remova o indicador de comentários, // da instrução Last-But-one na função Main (). Se você tentar compilar o programa, observe que o programa não será compilado, dando uma mensagem de erro.

A questão do especificador protegido surge quando os membros da classe derivada (herdada) devem acessar os membros da classe base (pai).

Classe derivada de público com membros públicos
Considere o seguinte programa:

#incluir
usando namespace std;
CLASSE THECLA

público:
int num1 = 10;
protegido:
int num2 = 20;
privado:
int num3 = 30;
;
Classe Childcla: Public TheCla

público:
Int Método1 ()

retornar num1;

Int Method2 ()

retornar num2;

/*int método3 ()

retornar num3;
*/
;
int main ()

Childcla Childobj;
int no1 = childobj.Método 1();
cout<int no2 = childobj.método2 ();
cout<retornar 0;

A saída é:

10
20

Na classe base, o num1 é público, o num2 é protegido e o num3 é privado. Na classe derivada, todas as funções de membro são públicas. A primeira função, Method1 (), acessa o membro de dados públicos, num1. A segunda função, Method2 (), acessa o membro de dados protegido, num2. A terceira função, Method3 (), embora atualmente comentada, deve acessar o membro de dados privado, num3.

Uma classe derivada não é declarada sem um especificador de acesso (público, protegido ou privado). Acima, a classe derivada é declarada com o especificador público, ou seja:

classe Childcla: public thecla

Agora não comparamento a definição de função do terceiro membro na classe derivada. Se você tentar compilar o programa, observe que ele não vai compilar, dando uma mensagem de erro.

Observação: Quando toda a classe derivada é declarada pública, seus membros não podem acessar os membros privados da classe base. Seus membros podem, no entanto, acessar os membros públicos e protegidos da classe base. O programa acima ilustra isso.

No entanto, observe que um membro público da classe Derivada Pública pode acessar um membro protegido da classe base.

Especificadores de classe derivados e especificadores de membros

Classe derivada protegida com membros públicos
Substitua o especificador "público" por "protegido" na declaração da classe derivada acima, como segue:

classe Childcla: tecla protegida

Compilar e executar o programa e observar que o resultado é o mesmo de antes.

Portanto, quando toda a classe derivada é declarada protegida, seus membros não podem acessar os membros particulares da classe base. Seus membros podem, no entanto, acessar os membros públicos e protegidos da classe base. É o mesmo que quando a classe derivada é declarada pública.

Observação: Um membro protegido da classe Derivada Pública pode acessar um membro protegido da classe base.

Classe derivada privada com membros públicos
Substitua o especificador "protegido" por "privado" na declaração da classe derivada acima, como segue:

classe Childcla: private TheCla

Compilar e executar o programa e observar que o resultado é o mesmo de antes.

Portanto, quando toda a classe derivada é declarada privada, seus membros não podem acessar os membros particulares da classe base. Seus membros podem, no entanto, acessar os membros públicos e protegidos da classe base. É o mesmo que quando a classe derivada é declarada protegida ou pública.

Classe derivada de público com membros protegidos
Digite, compilar e execute o seguinte programa, no qual toda a classe derivada é protegida, e seus membros também são protegidos. Alguns segmentos de código são os seguintes:

#incluir
usando namespace std;
CLASSE THECLA

público:
int num1 = 10;
protegido:
int num2 = 20;
privado:
int num3 = 30;
;
Classe Childcla: Public TheCla

protegido:
Int Método1 ()

retornar num1;

Int Method2 ()

retornar num2;

/*int método3 ()

retornar num3;
*/
;
int main ()

/*Childcla Childobj;
int no1 = childobj.Método 1();
cout</*int no2 = childobj.método2 ();
cout<retornar 0;

O programa funciona como é. Não há saída, e não deve haver nenhum resultado, com base em como o programa foi digitado.

Agora, não comparecerá a definição da função, Method3 (), na classe derivada. Se você tentar compilar o programa, observe que ele não vai compilar, dando uma mensagem de erro. Isso significa que um membro privado não pode ser acessado de uma função externa, operador externo ou classe derivada. Esta é a mesma conclusão que foi concluída acima, em relação ao acesso a um membro privado.

Observação: Um membro protegido da classe derivada protegida pode acessar um membro protegido da classe base.

Agora, coloque os comentários de volta na classe derivada e no uso do primeiro segmento de código na função principal (). Se você tentar compilar o programa, observe que o programa não será compilado devido ao primeiro segmento de código na função principal (). Este efeito não é novo. Além da classe derivada, funções externas e operadores externos, os membros protegidos e privados de uma classe (base ou derivada) são do mesmo especificador, privado. A função Main () vê o membro protegido de qualquer classe, seja base ou derivado, a partir do mesmo especificador, privado e é proibido de acessar.

Se o segundo segmento de código da função principal () não for contratado, a mesma explicação será aplicada. Ou seja, a função principal () não poderá acessar um membro protegido ou privado da classe derivada ou da classe base. Isso é independente de um membro protegido da classe derivada poderia acessar um membro protegido da classe base.

Classe derivada protegida com membros protegidos
Substitua o especificador "público" por "protegido" na declaração da classe derivada acima, como segue:

classe Childcla: tecla protegida

Coloque o comentário dos segmentos de código de volta à função Main (), se isso ainda não foi feito. Compilar e executar o programa e observar que o resultado é como antes.

Classe derivada privada com membros protegidos
Substitua o especificador "protegido" por "privado" na declaração da classe derivada acima, como segue:

Classe Childcla: Private TheCla

Compilar e executar o programa e observar que o resultado será como antes.

Classe derivada de público com membros particulares
Substitua o especificador "privado" por "público" na declaração da classe derivada acima, como segue:

classe Childcla: public thecla

Tornar os membros da classe derivada privada. Compile e rode o programa. O resultado não é diferente da "classe pública derivada com membros protegidos".

Classe derivada protegida com membros particulares
Substitua o especificador "público" por "protegido" na declaração da classe derivada acima, como segue:

classe Childcla: tecla protegida

Compile e rode o programa. Este resultado não é diferente da "classe derivada protegida com membros protegidos".

Classe derivada privada com membros particulares
Substitua o especificador "protegido" por "privado" na declaração da classe derivada acima, como segue:

classe Childcla: private TheCla

Compile e rode o programa. Este resultado não é diferente da "classe privada derivada com membros protegidos".

Conclusão

Os especificadores de acesso C ++ são as palavras "privadas", "protegidas" e "público.Eles decidem o acesso para membros de uma classe. A região de um especificador de acesso começa de seu rótulo, até o final da descrição da classe (definição) ou para o início de outro especificador de acesso. Qualquer membro de uma classe pode acessar qualquer outro membro dessa mesma classe. Um membro privado de uma classe não pode ser acessado por nenhuma função externa, qualquer operador externo ou uma classe derivada.

O membro da classe base deve ser protegido para que um membro privado da classe base possa ser acessado por um membro da classe derivada. Este membro protegido da classe base é visto como um membro privado da classe base por uma função externa ou um operador externo. Um membro público de uma classe pode ser acessado por qualquer função externa, qualquer operador externo ou uma classe derivada. Na ausência de qualquer especificador de acesso em uma classe, o especificador privado é assumido. Isto é, o especificador de acesso padrão é privado.