Relembrando
Em uma aula passada nós apresentamos as structures que eram estruturas para o agrupamento de variáveis, um recurso disponível tanto no C++ como na linguagem C. Uma das vantagens do uso de structures é que as variáveis por ela manipuladas ficam protegidas dentro da estrutura, não correndo o risco de conflitos com outras variáveis de mesmo nome.
No entanto existe outro recurso interessante no C++ que é o uso de Classes e Objetos, algo que não está disponível na Linguagem C.
Criando Classes
Para criar uma classe usamos a declaração Class, seguido do nome da classe, depois um par de abre e fecha chaves {}, dentro dos quais teremos um especificador de acesso, seguido de declarações de variáveis que serão os atributos da classe. Também poderemos ter uma estrutura parecida com funções que serão os métodos da classe, mas isso veremos posteriormente.
Digamos que eu queira criar uma classe chamada alunos para armazenar nomes e notas de alunos, de forma semelhante ao que vimos na aula de structures. Teríamos um código assim:
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- class aluno {
- public:
- string nome;
- int nota;
- };
- aluno aluno1;
- aluno aluno2;
- aluno1.nome = "Gabriel";
- aluno1.nota = 10;
- cout <<"Nome: "<< aluno1.nome << "\n";
- cout <<"Nota: "<< aluno1.nota << "\n";
- aluno2.nome = "Pedro";
- aluno2.nota = 9;
- cout <<"Nome: "<< aluno2.nome << "\n";
- cout <<"Nota: "<< aluno2.nota << "\n";
- return 0;
- }
Repare que da linha 6 a 10 eu tenho a criação da classe. As demais linhas praticamente preservam o mesmo exemplo de structure nomeada que utilizei na aula de structures.
Dentro da classe eu tenho declarações de algumas variáveis. Como essas variáveis estão dentro da classe dizemos que elas protegidas de forma semelhante às structures. Essas variáveis são chamadas de atributos da classe.
Nas linhas 11 e 12 eu criei dois objetos usando a estrutura da classe. Por isso dizemos que esses dois objetos são instâncias da classe.
Além da declaração class no lugar de struct, a principal diferença entre a classe e as structures é a presença da instrução public: que é o chamado especificador de acesso. Nas structures ele sempre é public, por isso não ele não é escrito.
Especificadores de acesso nas Classes
Os especificadores de acesso servem para definir a forma como os membros de uma classe poderão ou não ser acessados. O termo "membros" refere-se aos atributos e métodos da Classe. No C++ temos três tipos especificadores de acesso:
- public - os membros podem ser acessados por instruções de fora da classe
- private - os membros não podem ser acessados por instruções de fora da classe
- protected - membros não podem ser acessados por instruções de fora da classe, mas poderão ser acessados em classes derivadas.
Classes derivadas, superclasses e herança na POO
Uma classe derivada ou subclasse é uma classe que foi criada com base em uma classe original já existente. Por exemplo, a nossa classe aluno poderia dar origem a uma nova classe chamada bolsista, que seriam alunos que recebem um valor de bolsas de estudo da escola. Aluno seria o que chamamos de superclasse.
Como a classe aluno possui os atributos nome e nota, a classe bolsista também teria esses atributos, pois eles seriam herdados da classe original. Essa transmissão de membros de uma superclasse para uma subclasse é que a POO chama de herança. Exemplo:
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- class aluno {
- public:
- string nome;
- int nota;
- };
- class bolsista: public aluno {
- public:
- int bolsa;
- };
- bolsista aluno1;
- aluno1.nome = "Gabriel";
- aluno1.nota = 10;
- aluno1.bolsa=1000;
- cout <<"Nome : "<< aluno1.nome << "\n";
- cout <<"Nota : "<< aluno1.nota << "\n";
- cout <<"Bolsa: "<< aluno1.bolsa << "\n";
- return 0;
- }
No exemplo acima eu tenho na linha 11 a subclasse ou classe derivada bolsista sendo criada com base na classe original ou superclasse aluno. Repare na linha 13 que a subclasse apenas incorpora um novo atributo que é bolsa.
No entanto nas linhas 16 e 17 vemos que o objeto instanciado aluno1 possui os atributos nome e nota, porque herdou da superclasse. Alguns autores também usam os termos classe filho para a subclasse e classe pai ou classe base para a superclasse.
Esse conceito de herança entre classes e objetos é mais um dos quatro pilares da POO. Agora que já sabemos como instanciar um objeto a partir de uma classe e acessar os seus atributos, poderemos ver na próxima aula o conceito de método e relembrar o que são funções.
Referências
DEITEL, H. M. DEITEL, P. J. C++: Como programar. Pearson Education do Brasil. 2006.
GBDONLINE. Learn C++ Programming. Disponível em: <https://learn.onlinegdb.com/c%2B%2B_for_beginners> Acesso em 05 ago. 2024.
W3SCHOOLS. C++ Tutorial. Disponível em: <https://www.w3schools.com/cpp/default.asp> Acesso em 05 ago. 2024.