AULA 3 - Programação II - Graduação
Modificado de [C++ como programar, Deitel & Deitel] e de [C++ Absoluto, Savitch]
Programação orientada a objetos
A programação orientada a objetos (POO) encapsula dados (atributos) e funções (métodos) em pacotes chamados classes.
Uma classe é como a planta de uma casa. A partir da planta, o construtor pode construir uma casa. A partir de uma classe, o programador pode construir um objeto.
Uma planta pode ser reutilizada muitas vezes para se fazer muitas casas. Uma classe pode ser reutilizada muitas vezes para se criar muitos objetos.
As classes têm a propriedade de ocultação de informações. Isso significa que, embora os objetos da classe possam saber como comunicar-se uns com os outros, através de interfaces bem-definidas, normalmente não é permitido às classes saber como as outras classes são implementadas. Os detalhes da implementação são escondidos dentro das próprias classes.
Em C e outras linguagem procedurais, a programação tende a ser orientada a funções, enquanto que em C++ a programação é orientada a objetos.
Implementando uma classe simples - DiadoAno
Como exemplo, vamos ilustrar o processo de implementação de um tipo abstrato relacionado com datas, e atributos e ações que lhe digam respeito.
Os campos membros dos objetos são chamados de atributos, ou membros de dados e as ações são chamadas de métodos ou funções-membro.
Tipos contendo membros de dados e funções membro são definidos em C++ utilizando-se a palavra-chave class.
Ex:
class DiadoAno{
public:
void Mostra();
private:
int dia; //0-31
int mes; //0-12
int ano; //0-2017
};
A definição da classe começa com a palavra reservada class. O nome da classe, DiadoAno, segue a palavra-chave.
O corpo da classe é delimitado pelas chaves ({ e }) e termina com o ponto e vírgula (;).
Esta classe possui um método PÚBLICO (public), Mostra() e três atributos PRIVADOS (private), dia, mes e ano.
Os modificadores public: e private: são chamados de especificadores de acesso a membros.
Quaisquer atributos ou métodos declarados depois do especificador de acesso a membros public (e antes do próximo especificador) são acessíveis onde quer que o programa tenha que acessar um objeto da classe DiadoAno.
Quaisquer atributos ou métodos declarados depois do especificador de acesso a membros private (e antes do próximo especificador) são acessíveis somente a métodos da própria classe DiadoAno.
Isto significa que um programa usuário da classe não poderá acessar diretamente um atributo private, mas apenas através de um método público.
Um exemplo de utilização desta classe seria o programa C++ abaixo (CodeBlocks):
1 #include <iostream>
2 using namespace std;
3
4 class DiadoAno
5 { public:
6 void Mostra();
7 private:
8 int dia; //0-31
9 int mes; //0-12
10 int ano; //0-2017
11 };
12
13 int main()
14 { DiadoAno hoje;
15 hoje.Mostra();
16 return 0;
17 }
18
19 void DiadoAno::Mostra()
20 {
21 cout << "Informe o dia (0-31)" << endl;
22 cin >> dia;
23 cout << "Informe o mes (0-12)" << endl;
24 cin >> mes;
25 cout << "Informe o ano (0-2017)" << endl;
26 cin >> ano;
27 cout<< "Hoje \202 dia: " << dia << "/" << mes << "/" << ano <<"\n";
28 }
Note como funciona a definição de um método da classe (linhas 19 a 28).
A saída do programa será:
Note que os atributos privados só podem ser acessados pelo método Mostra().
Este foi chamado, tranquilamente, na função externa à classe main(), na linha 15.
Mas se vc tentar acessar também um dos atributos, como dia, na função main(), o compilador dará erro:
Adicionando funcionalidades
A classe DiadoAno não tem muita sofisticação e proteção contra erros. E uma das filosofias da POO é, justamente, que as classes sejam unidades de código as mais autônomas possível.
Assim, é necessário acrescentar funcionalidades à classe, de forma a torná-la completa e menos sensível a erros.
Por exemplo, o método VerificaData() permite checar se a data digitada é válida.
1 #include <iostream>
2 using namespace std;
3
4 class DiadoAno
5 { public:
6 void Mostra();
7 private:
8 int dia; //1-31
9 int mes; //1-12
10 int ano; //0-2017
11 VerificaData();
12 };
13
14 int main()
15 { DiadoAno hoje;
16 hoje.Mostra();
17 return 0;
18 }
19
20 void DiadoAno::Mostra()
21 {
22 cout << "Informe o dia (1-31)" << endl;
23 cin >> dia;
24 cout << "Informe o mes (1-12)" << endl;
25 cin >> mes;
26 cout << "Informe o ano (0-2017)" << endl;
27 cin >> ano;
28 cout<< << "/" << mes << "/" << ano <<"\n";
29 }
30
31 void DiadoAno::VerificaData()
32 { if(dia <1 || dia>31)
33 cout<< "\nErro no dia fornecido!!! Entre com um valor entre 1 e 31";
34 else
35 cout << "Hoje \202 dia: " << dia ;
36 if(mes<1 || mes >> 12)
37 cout<< "\nErro no mes fornecido!!! Entre com um valor entre 1 e 12";
38 else
39 { switch(mes)
40 { case 1: cout << " de Janeiro "; break;
41 case 2: cout << " de Fevereiro "; break;
42 case 3: cout << " de Março "; break;
43 case 4: cout << " de Abril "; break;
44 case 5: cout << " de Maio "; break;
45 case 6: cout << " de Junho "; break;
46 case 7: cout << " de Julho "; break;
47 case 8: cout << " de Agosto "; break;
48 case 9: cout << " de Setembro "; break;
49 case 10: cout << " de Outubro "; break;
50 case 11: cout << " de Novembro "; break;
51 case 12: cout << " de Dezembro "; break;
52 }
53 }
54 if (ano <0 || ano > 2017)
55 cout<< "\nErro no ano fornecido!!! Entre com um valor entre 0 e 2017";
56 else
57 cout << "de " << ano << ".\n\n";
58 }

