Programação Orientada a Objetos C++ Prof. Érico Olavo Weissheimer 1 Histórico de Orientação a Objetos A OO surgiu no final da década de 60, quando dois cientistas dinamarqueses criaram a linguagem Simula (Simulation Language) 1967 - Linguagem de Programação Simula-67conceitos de classe e herança O termo Programação Orientada a Objetos (POO) é introduzido com a linguagem Smalltalk (1980) Inicio dos anos 90 Paradigma de Orientação a Objetos abordagem poderosa e prática para o desenvolvimento de software 2 Vantagens da Orientação a Objetos Abstração de dados: os detalhes referentes às representações das classes serão visíveis apenas a seus atributos; Reutilização: o encapsulamento dos métodos e representação dos dados para a construção de classes facilitam o desenvolvimento de software reutilizável, auxiliando na produtividade de sistemas; Flexibilidade: as classes delimitam-se em unidades naturais para a alocação de tarefas de desenvolvimento de software; 3 Vantagens da Orientação a Objetos Extensibilidade: facilidade de estender o software devido a duas razões: herança: novas classes são construídas a partir das que já existem; as classes formam uma estrutura fracamente acoplada o que facilita alterações; Mesma notação é utilizada desde a fase de análise até a implementação. Manutenibilidade: a modularização natural em classes facilita a realização de alterações no software. 4 Exemplos de Linguagens Orientada a Objetos Existem diversas linguagens OO, tais como: Smalltalk (1980) Ada (1983) Eiffel (~1985) Object Pascal (1986) Common Lisp (1986) C++ (~1989) Java 5 Conceitos Básicos de Orientação a Objetos Criou o conceito de objeto, que é um tipo de dado com uma estrutura e operações para manipular esta estrutura. Tipos definidos pelo usuário devem se comportar da mesma maneira de tipos pré-definidos (fornecidos pelo compilador). Os objetos trocam mensagens entre si. Essas mensagens resultam na ativação de métodos, os quais realizam as ações necessárias. Os objetos que compartilham uma mesma interface, ou seja, respondem as mesmas mensagens, são agrupados em classes. 6 Exemplo de Classe e Objetos Objetos e Classes Palio JWO-4567 Parati KLJ-0978 Automóvel Marca Placa Celta JDK-6543 CLASSE OBJETOS (Instâncias da classe Automóvel) 7 Conceitos de Classe Classes: É um tipo definido pelo usuário que contém o molde, a especificação para os objetos, assim como o tipo inteiro contém o molde para as variáveis declaradas como inteiros. A classe envolve, associa, funções e dados, controlando o acesso a estes, definí-la implica em especificar os seus atributos (dados) e suas funções membro (código). Todo objeto é uma instância de uma Classe. Possuem propriedades (ATRIBUTOS) e comportamento (MÉTODOS). 8 Conceitos de Classe Exemplos de Classes: aluno conta corrente folha de cheque automóvel cliente fornecedor time de futebol jogo de futebol 9 Conceito de Objetos Objetos: Tudo em Orientação a Objetos é OBJETO. Objeto, no mundo físico, é tipicamente um produtor e consumidor de itens de informação. Definição (mundo do software) “Qualquer coisa, real ou abstrata, a respeito da qual armazenamos dados e métodos que os manipulam” Martin, Odell (1995) Abstração de uma entidade do mundo real e que possuí características (VALORES). É uma instanciação de uma classe. 10 Conceito de Objetos Exemplos de objetos: um aluno (“Carlos Alberto da Silva”) uma conta corrente (“0123-003934-1”) uma folha de cheque (“234564”) um automóvel (“Honda Civic preto 06/06”) um cliente (“Maria Antonia Guimaraes”) um fornecedor (“Bosch”) um time de futebol (“Palmeiras”) uma partida de futebol (“Palmeiras x Santos”) 11 Conceito de Atributos Atributos: Representam um conjunto de informações, ou seja, elementos de dados que caracterizam um objeto. Descrevem as informações que ficam escondidas em um objeto para serem exclusivamente manipulado pelas operações daquele objeto. São variáveis que definem o estado de um objeto, ou seja, são entidades que caracterizam os objetos. Cada objeto possui seu próprio conjunto de atributos. 12 Conceitos Básicos Métodos: Quando um objeto é mapeado dentro do domínio do software, os processos que podem mudar a sua estrutura de dados são denominados Operações ou Métodos. Métodos são invocados por Mensagens. Cada objeto possui seu próprio conjunto de métodos Definições: São procedimentos ou funções definidos e declarados que atuam sobre um objeto. 13 Notação de Classe em UML Atributos e Métodos: Automóvel Placa Fabricante Modelo Proprietario RegistrarDados ImprimirDados ValidarFabricante CLASSE ATRIBUTOS MÉTODOS 14 Notação de Classe em UML Atributos e Métodos: Pessoa Cpf Nome Estado Civil Ano Nascimento Naturalidade UF CadastrarPessoa CalcularIdade CLASSE ATRIBUTOS MÉTODOS 15 Exemplo Programação Orientada a Objetos em C++ class Pessoa { // Atributos int Cpf; char Nome[30]; int DataNascimento; Definição de uma classe Pessoa em C++ Dados encapsulados // Metodos }; void CadastrarPessoa(); void ImprimirPessoa(); void CalcularIdade(); main() { Pessoa p; } Métodos Instanciação de um objeto Pessoa (p) return 0; 16 Conceito de Encapsulamento Encapsulamento: Objetos encapsulam seus atributos. Propriedade segundo a qual os atributos de uma classe são acessíveis apenas pelos métodos da própria classe; Outras classes só podem acessar os atributos de uma classe invocando os métodos públicos. Restringe a visibilidade do objeto, mais facilita o reuso Os DADOS e os MÉTODOS são empacotados sob um nome e podem ser reusados como uma especificação ou componente de programa. 17 Dados Públicos e Privados Privados: somente as funções (métodos) membro da classe podem acessá-los. Sendo privados, os programas não podem acessar os membros da classe usando o operador ponto objeto.alguma_variável = valor Se não colocar o rótulo public, pressupõe-se que todos os membros são privados 18 Dados Públicos e Privados class funcionario { private: char nome[64]; long func_id; float salario; public: int atribui_valores(long x, float y); void exibe_funcinario(); }; 19 Exemplo Programação Orientada a Objetos em C++ #include <iostream> using namespace std; class Pessoa { private: char Nome[30]; char Cpf[11]; int AnoNasc; public: void CadastrarPessoa() { cout <<"\nNome: "; cin.getline(Nome,30); cout << "CPF: "; cin.getline (Cpf,12); cout <<"\nAno Nascimento: "; cin >> AnoNasc; }; void ImprimirPessoa() { cout << Cpf << "\n"; cout << Nome << "\n"; cout << AnoNasc; }; }; main() { Pessoa p; Erro: variável Private só pode ser acessadas pelos métodos p.AnoNasc = 1971; p.CadastrarPessoa(); p.ImprimirPessoa(); system("pause"); } 20 Exemplo Programação Orientada a Objetos em C++ A medida que os métodos se tornarem maiores, defini-los dentro da classe poderá congestionar a definição de classe Solução: colocar o protótipo dentro da classe e definir o método fora dela Ex: class funcionario { void exibe_func(void); }; //Protótipo Nome do método void funcionario::exibe_func(void) Nome da classe { }; 21 Exercícios: 1. 2. 3. 4. Declarar os métodos do exemplo, colocando os códigos dos métodos fora da classe. Criar um novo método para a classe Pessoa (exemplo anterior) que calcule a idade. A idade calculada deverá ser mostrada no método ImprimirPessoa. Fazer um programa que tenha um método que inicialize uma variável com 0, outro que incremente esta variável e outro que mostre o valor incrementado. O programa principal deverá chamar 5 vezes o método que incrementa e o método que mostra o valor. Fazer um programa que implemente a classe Automóvel 22 mostrada no slide 14. Conceito de Herança Herança: É o mecanismo pelo qual uma subclasse herda todas as propriedades da superclasse e acrescenta suas próprias e exclusivas características. As propriedades da superclasse não precisam ser repetidas em cada subclasse. Propicia a reutilização de código. 23 Herança Automovel Placa Fabricante Modelo Proprietario Passeio Taxi Lotação Cor NumeroTaxi NumeroPassag 24 Exemplo Herança SuperClasse Automovel class Passeio:public Automovel { SubClasse que esta herdando da SuperClasse Automovel private: char Cor[15]; public: void RegistrarCor(); }; ... Método da SubClasse Passeio void Passeio::RegistrarCor() { cout << "Cor: "; cin.getline (Cor,16); }; int main() { Passeio Pass; Instanciando SubClasse Passeio 25 Exercícios: 1. Fazer um programa para criar as subclasses mostradas no slide 24, tendo-se nestas subclasses os métodos para ler e mostrar os seus atributos. 2. Crie uma classe Retângulo. A classe possui os atributos altura e base e 4 métodos: 1. ler a base e a altura, 2. calcular a área (base*altura) (declarar como função), 3. calcular o perímetro (soma dos todos os lados) (declarar como função), 4. mostrar os valores da área e do perímetro. 26 Exercícios: 3. Crie a classe ContaBancaria, com os seguintes atributos: NumeroConta e Saldo. Esta classe deverá ter os seguintes métodos: Aberturaconta, onde deverá ser lido o número da conta e o saldo inicializando com 0, OperacaoCredito, somar valor informado com o saldo, OperacaoDebito, debitar valor informado do saldo, MostrarSaldo. Deverá ser lido 5 movimentações, sendo lido o tipo da operação (C ou D) e o valor da transação. O número da conta e o saldo deverão ser mostrado após as 5 movimentações. 27 Exercícios: 4. Implementar em C++ as classes que seguem abaixo: Pessoa Nome Endereço Cidade CadastrarPessoa AlterarEndereço PessoaFisica PessoaJuridica Sexo Idade CPF NomeFantasia CNPJ IncluirDadosPJuridica IncluirDadosPFisica 28 Herança: Arquivo Header A definição das classes podem estar divididos em vários arquivos do tipo Header (extensão .h). Estes arquivos Header são criados pelos programadores, com o objetivo de melhor organização e encapsulamento. É costume deixar nesses arquivos somente a interface das classes e funções para que os programadores possam olhá-los, como uma "library". 29 Exemplo Arquivo Header Arquivo header #include ... Automovel.h #include "Automovel.h" class Taxi:public Automovel { private: int NumeroTaxi; public: void RegistrarTaxi(); { cout << "Numero Taxi "; cin >> NumeroTaxi; }; }; int main() { Taxi Tx; Tx.RegistrarDados(); Tx.RegistrarTaxi(); return 0; } Arquivo header Automovel.h: using namespace std; class Automovel { private: char Placa[7]; char Fabricante[30]; public: void RegistrarDados(); void ImprimirDados(); void ValidarFabricante(); }; void Automovel::RegistrarDados() { cout << "Placa: "; cin.getline(Placa,8); }; void Automovel::ImprimirDados() .... 30 Exercícios 1. 2. Gravar a classe Automovel como sendo um arquivo tipo header. Alterar o programa gerado no exercício 1 do slide 26, fazendo uso deste arquivo header, onde deverá ser criado um arquivo header para a super-classe automovel e headers para as sub-classes taxi, passeio e lotacao. Deverá ter um programa principal. 31 Dados Protected Os atributos da classe pai não podem ser acessados pelos métodos das classes filhas, se estes estiverem declarados como private. Para que os atributos da classe pai possam ser acessados pelos métodos das classes filhas, estes devem ser declarados como protected. Exemplo: class Automovel { protected: char Placa[7]; ..... class Passeio:public Automovel { private: char Cor[15]; public: void RegistrarCor(); { Atributo da classe pai sendo cout << "Placa: "; acessado por método de uma cin.getline (Placa,8); }; classe filha 32 Polimorfismo Geralmente representa a qualidade ou estado de um objeto ser capaz de assumir diferentes formas. Mais especificamente, propriedade segundo o qual vários métodos podem existir com o mesmo nome. Ao receber uma mensagem para efetuar uma Operação, é o objeto quem determina como a operação deve ser efetuada; Permite a criação de várias classes com interfaces idênticas, porém objetos e implementações diferentes. 33 Polimorfismo Veículo Verificar() Reparar() Limpar() Automóvel Bicicleta Verificar() Reparar() Limpar() Verificar() Reparar() Limpar() 34 Classes Abstratas Classes abstratas são classes que não produzem instâncias. Elas agrupam características e comportamentos que serão herdados por outras classes. Fornecem padrões de comportamento que serão implementados nas suas subclasses. Podem ter métodos com implementação definida. Figura Atributos area Operações calcularArea {abstrato} informarArea 35 Exercícios 1. Implementar as classes da figura abaixo, usando o conceito de polimorfismo e classe abstrata. Figura Atributos Operações Area,altura,base ler altura,base calcularArea {abstrato} MostrarArea Triângulo Retângulo Atributos Atributos Operações Operações calcularArea altura*base calcularArea (base*altura)/2 36 Construtor São métodos declarados como funções que são chamados no momento da criação de um objeto. São usados para inicializar os objetos. Este tipo de método não possuí valor de retorno. Um construtor tem sempre o mesmo nome da classe. Se nenhum for declarado será criado um construtor default 37 Exemplo Construtor #include <iostream> using namespace std; class ponto { float x; float y; public: ponto(int a,int b); //esse e o construtor, note a ausência do valor de retorno void mostra(void); }; ponto::ponto(int a,int b) //método construtor: tem sempre o nome da classe { x=a; //incializando atributos da classe y=b; }; void ponto::mostra(void) {cout << "X:" << x << " , Y:" << y; system ("pause"); }; main() { ponto ap(1,2); ap.mostra(); } 38 Destrutor O destrutor diz como o objeto será destruído quando sair de escopo. O funcionamento é análogo ao método Construtor, ou seja: Não possuí valor de retorno. Tem sempre o mesmo nome da classe, só que precedido por ~. Se nenhum for declarado será criado um destrutor default. seu argumento é sempre void. 39 Exemplo Destrutor #include <iostream> using namespace std; class ponto { float x; float y; public: ponto(int a,int b); // método construtor ~ponto(void); // método destrutor void mostra(); }; ponto::ponto(int a,int b) //códido do método construtor { x=a; y=b; }; ponto::~ponto(void) // método destrutor: tem o mesmo nome da classe precedido de ~ { cout << " Variaveis destruidas"; system("pause"); }; void ponto::mostra(void) { cout << "X:" << x << " , Y:" << y << "\n"; system ("pause"); }; main() { ponto ap(1,2); ap.mostra(); } // o método destrutor será executado automaticamente 40 Analogia com Programação Tradicional Analogia dos conceitos principais no paradigma orientado a objeto e no paradigma tradicional de programação Linguagens Orientadas a Objetos Linguaguens Tradicionais Objeto Valor Classe Tipo (TAD) Mensagem Chamada de Procedimento Método Procedimento ou Função Interface Conjunto de nomes e funções para um fim específico 41