AULA 3 - Programação II - Graduação
Modificado de [C++ como programar, Deitel & Deitel] e de [C++ Absoluto, Savitch]
Programação orientada a objetos
Linguagem Orientada a Objetos: combinação, em um único registro, de dados e funções que vão operar nestes dados – CLASSES.
- Campos das classes: MEMBROS ou ATRIBUTOS.
- Funções: FUNÇÕES-MEMBRO ou MÉTODOS.
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.
- OBJETOS (instâncias) são “variáveis” de um determinado tipo de Classe.
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.
ENCAPSULAMENTO: tornar a classe independente/autônoma e manter sigilo sobre as características da mesma.
Como encapsular? ⇒ Permitindo apenas às funções-membro da classe alterar/atribuir valores aos membros do objeto!
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.
Definição de uma classe
class Nome_Classe
{private:
Declarações MembrosPrivados;
DeclaraçõesMetodosPrivados( );
public:
Declarações MembrosPúblicos;
DeclaraçõesMetodosPúblicos( );
protected:
Declarações MembrosProtegidos;
DeclaraçõesMetodosProtegidos( );
};
Não se faz inicialização explícita de atributos na declaração da Classe*. Contra-ex: public int x = 0;
Especificadores de Acesso:
- Membros e Métodos Privados – private : podem ser acessados APENAS por outros métodos do mesmo objeto ou a funções friend da classe;
- Membros e Métodos Públicos – public : são acessíveis em todos os lugares onde a classe estiver acessível (escopo da classe);
- Membros e Métodos Protegidos – protected : são acessíveis pelas classes derivadas (através de herança);
- Membros e Métodos Publicados (Borland C++ Builder) – _published : têm acesso público e são publicados no Object Inspector, quando a classe/componente (necessariamente derivada de TObject) é adicionada ao projeto. Não admitem Construtor/Destrutor.
Exemplo:
class Retangulo // declaração da classe
{ private:
int base, altura; // Dados membros privados
public:
void Inic(int b, int h) // método de inicialização
{ base = b; altura = h; }
void ImprimeSaida( ) // método que imprime área
{ cout << “\nBase = “ << base << “ Altura=“ << altura;
cout << “\nÁrea = “ << (base*altura);
}
};
Observação: métodos definidos dentro da definição da classe → Métodos Inline.
Quando optar-se pela definição externa: no corpo da classe usa-se o protótipo do método. Ex:
void Inic(int b, int h);
E no corpo do método:
tipo NomeClasse :: NomeMétodo( )
{ ...
}
Assim:
1 class Retangulo // declaração da classe
2 { private: int base, altura;
3 public:
4 void Inic(int b, int h); // método de inicialização
5 void ImprimeSaida( ); // método que imprime área
6 };
7
8 void Retangulo::Inic(int b, int h)
9 { base = b; altura = h; }
10
11 void Retangulo::ImprimeSaida()
12 { cout << “\nBase = “ << base << “ Altura=“ << altura;
13 cout << “\nÁrea = “ << (base*altura);}
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; //1-31
int mes; //1-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; //1-31
9 int mes; //1-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 (1-31)" << endl;
22 cin >> dia;
23 cout << "Informe o mes (1-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 }

