Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Orientada a Objetos em C++: Classes BCC702-Programação de Computadores II Emiliana Mara Lopes Simões simoes.eml@gmail.com Universidade Federal de Ouro Preto março 2010 Abstração As pessoas tipicamente tentam compreender o mundo construindo modelos que abstraem apenas as características relevantes do que está sendo observado Abstração Estruturas de Dados Conjunto de dados que representa uma situação real(Abstração da realidade) Os dados podem estar representados (estruturados) de diferentes maneiras Normalmente, a escolha da representação é determinada pelas operações que serão realizadas sobre eles Exemplo: Números inteiros Representação por palitinhos: II + IIII = IIIIII Boa para pequenos números (operação simples) Representação decimal: 1278 + 321 = 1599 Boa para números maiores (operação complexa) Tipos Abstratos de Dados (TADs) Um Tipo Abstrato de Dados (TAD) agrupa a estrutura de dados juntamente com as operações que podem ser feitas sobre esses dados Exemplo: Tipos Abstratos de Dados (TADs) O TAD encapsula a estrutura de dados. Isto é, os usuários do TAD só tem acesso a algumas operações disponibilizadas sobre esses dados Usuário só “enxerga” a interface, não a implementação Classes Em linguagens orientadas a objeto, como C++, a implementação de um TAD é feita através de classes. A classe é composta por: Atributos: Dados da classe; Funções membro ou métodos: Rotinas que acessam e manipulam os atributos da classe Classes Exemplo Objeto Um objeto é uma instância de uma classe identificado de forma única através de um nome Programação Orientada a Objetos É uma metodologia de desenvolvimento de software Usa classes e objetos criados a partir de abstrações da realidade, para representar e processar dados Sua principal vantagem é a proximidade com a forma com que os seres humanos visualizam e entendem o mundo ao seu redor Programação Orientada a Objetos Vantagens da POO: Modularidade Reusabilidade Produtividade Facilitar Manutenção Implementação E como fica a implementação de tudo isso???? Classes Quando queremos criar um projeto com diversas classes uma boa prática de programação é definirmos nossas classes seguindo as seguintes convenções: Criamos um arquivo de extensão .h só com a definição da classe; E um arquivo de extensão .cpp só com a implementação das suas funções. Classes Forma geral de uma definição de classe em C++ class nome_da_classe{ private: //declaração de dados e funções privadas public: //declaração de dados e funções públicas }; Arquivo: nome_da_classe.h Classes Exemplo: Definição da classe Circulo class Circulo{ private: float raio; float x, y; public: void mover(float deltaX, float deltaY); void aumentar(float deltaR); }; Arquivo: Circulo.h Classes Forma geral da definição de uma função da classe #include “nome_da_classe.h” tipo_de_retorno nome_da_classe::nome_do_método(lista_de_parâmetros){ //código do método } Arquivo: nome_da_classe.cpp Classes Exemplo: Definição das funções da classe Circulo #include “Circulo.h” void Circulo::mover(float deltaX, float deltaY){ x = x + deltaX; y = y + deltaY; } void Circulo::aumentar(float deltaR){ raio = raio + deltaR; } Arquivo: Circulo.cpp Classes Exemplo: Instanciando um objeto da classe Circulo no main #include “Circulo.h” main(){ Circulo c; c.aumentar(10); } Arquivo: main.cpp Classes: Método Construtor HÁ UM “PROBLEMA” NA CLASSE ANTERIOR Quais são os valores iniciais das variáveis x, y e raio para um objeto da classe Circulo???? Classes: Método Construtor É um método especial que é chamado quando criamos um novo objeto; Deve possuir o mesmo nome da classe; Não possui valor de retorno, nem mesmo void; É utilizado para inicializar os atributos da classe. ENTÃO A SOLUÇÃO É: Criar um método construtor para a classe Circulo Classes: Método Construtor Exemplo: Definição da classe Circulo com declaração de um método construtor sem parâmetros class Circulo{ private: float raio; float x, y; public: Circulo(); void mover(float deltaX, float deltaY); void aumentar(float deltaR); }; Arquivo: Circulo.h Classes: Método Construtor Exemplo: Definição do método construtor sem parâmetros #include “Circulo.h” Circulo::Circulo(){ x = 0; y = 0; raio = 1; } ... Arquivo: Circulo.cpp Classes: Método Construtor Observações: Um construtor pode ter vários parâmetros; Uma classe pode ter vários construtores que se diferem pela lista de parâmetros. PORTANTO: O construtor a ser chamado depende da forma como o objeto da classe está sendo instanciado Classes: Método Construtor Exemplo: Definição da classe Circulo com declaração de construtores sem/com parâmetro class Circulo{ private: float raio; float x, y; public: Circulo(); Circulo(float r); void mover(float deltaX, float deltaY); void aumentar(float deltaR); }; Arquivo: Circulo.h Classes: Método Construtor Exemplo: Definição de construtores sem/com parâmetro #include “Circulo.h” Circulo::Circulo(){ x = 0; y = 0; raio = 1; } Circulo::Circulo(float r){ x = 0; y = 0; raio = r; } ... Classes: Método Construtor Exemplo: Instanciando objetos da classe Circulo no main #include “Circulo.h” main(){ Circulo c1; Circulo c2(5); c1.aumentar(10); c2.aumentar(10); } Escopo de Variáveis Atributos declarados em uma classe são válidos por toda a classe Variáveis declaradas dentro de um método de uma classe só serão válidas dentro desse método Modificadores de acesso Modificadores de acesso podem ser usados tanto em atributos como em métodos O objetivo é proteger a integridade e a consistência dos dados e operações que uma determinada classe manipula Modificadores de acesso Membros de uma classe podem ser: public: Podem ser acessados em qualquer lugar private: Só podem ser acessados pelos membros da própria classe protected: Podem ser acessados apenas por membros da própria classe ou das suas sub-classes ou classes derivadas Funções get e set Exemplo: Tentativa de acesso a membros private fora da classe #include “Circulo.h” main(){ Circulo c1; Circulo c2(5); c1.aumentar(10); c2.aumentar(10); //ERRO!!!!! c1.raio = 3; } Funções get e set São funções usadas para acessar e modificar dados encapsulados da classe indiretamente get (obter o valor de) Serve para se ter acesso aos atributos encapsulados de uma classe set (atribuir valor a) Útil para permitir a modificação dos atributos da classe encapsulados Garante a integridade dos dados Exemplo: Funções get e set para o atributo raio class Circulo{ private: float raio; float x, y; public: Circulo(); Circulo(float r); void setRaio(float r); float getRaio(); void mover(float deltaX, float deltaY); void aumentar(float deltaR); }; Arquivo: Circulo.h Exemplo: Definição das funções get e set para o atributo raio #include “Circulo.h” void Circulo::setRaio(float r){ if(r >= 0) raio = r; } float Circulo::getRaio(){ return raio; } ... Funções get e set Exemplo: Alterando membro private utilizando a função set #include “Circulo.h” main(){ Circulo c1; Circulo c2(5); c1.aumentar(10); c2.aumentar(10); //CORRETO!!!! c1.setRaio(3); } Funções get e set Exemplo: Alterando membro private utilizando a função set #include “Circulo.h” main(){ Circulo c1; Circulo c2(5); c1.aumentar(10); c2.aumentar(10); //Chamada correta de função, porém com valor não //permitido para o raio c1.setRaio(-5); } Exercício em sala Implemente uma classe Ponto para os pontos bidimensionais (x, y). Inclua um construtor default, funções get e set para seus atributos, uma função dist() para retornar a distância do ponto a partir da origem (0, 0) e uma função print() para imprimir as coordenadas do ponto. Dúvidas? Próxima Aula Classes
Compartilhar