Classes e Encapsulamento

Documentos relacionados
Tipos Abstratos de Dados (TAD)

C com introdução a OO

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Introdução a POO. Introdução a Linguagem C++ e POO

Programação Avançada C++ Slide 12 Nielsen Castelo Damasceno

Classes e Objetos. Sintaxe de classe em Java

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

13/11/15. Incrementando C: C++ E na especificação de BigInt... Arquitetura da solução exemplo. O arquivo de declarações. Explorando a classe BigInt

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

Técnicas de Programação:

Classes e Objetos. Prof. Leonardo Barreto Campos 1

Linguagem de Programação III

POO e C++: Herança e Polimorfismo

Análise de Programação

Programação Orientada a Objetos para Redes de Computadores

Programação Orientada a Objetos Aula I Declaração de classes, métodos construtores. Prof.: Bruno E. G. Gomes IFRN

Parte IV. Linguagens de Programação. Relembrando da Última Aula... Empacotador de Préprocessadores. Primeiro Exemplo Usando Classes em C++

Paradigmas de Linguagens de Programação. Tipos de Dados Abstratos

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Descrição de recursos de C++ não relacionados às classes

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Linguagem de Programação C++

Classes, Métodos e Propriedades

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Ponteiros de Variáveis

Relacionamentos entre objetos

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos.

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Programação Orientada a Objetos

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

Programação Orientada a Objetos

Programação Orientada a Objetos (DPADF 0063)

Programação Estruturada e Orientada a Objetos. Objetos e Métodos

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Uma função pode ser declarada como friend de mais do que uma classe.

Aprendendo. Java 2. Rodrigo Mello Ramon Chiara Renato Villela. Novatec Editora Ltda.

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Declaração de Construtores em Java

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Introdução a Programação. Tipos Estruturados de Dados

Linguagem de Programação II Implementação

Programação científica C++

Linguagem de Programação IV Introdução

1. Selecione a Estrutura de Dados que melhor representa os diretórios ou pastas de arquivos do computador.

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Linguagem de Programação III

Programação orientada a objetos

C++ Orientado a Objetos

Linguagem de Programação II Implementação

C++ - Funções. Forma geral das funções C++

E N C A P S U L A M E N T O P R O F. M E. H É L I O E S P E R I D I Ã O

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Módulo 5 Vetores e Alocação Dinâmica

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Programação Orientada a Objetos C++

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

Transcrição:

Classes e Encapsulamento Marcio Santi POO e C++ Tipo Abstrato de Dados (TAD) TAD atributos dados que o representam interface operações associadas como é manipulado 1

Exemplo: Editor Gráfico (classe círculo) círculo struct circle double x, y; double rad; void translation( ); void scale( ); double area( ); double perim( ); atributos interface (x,y) rad Conceito de classes em C++ O conceito de classes em C++ pode ser visto como uma extensão à idéia de estruturas encontrada em C puro. É uma forma de se implementar um tipo e associar a ele funções e operadores. Uma classe em C++ é o elemento básico sobre o qual toda a orientação a objetos está apoiada. Classes (TAD) não são definidos pela sua representação interna, mas sim pelas operações sobre esse tipo (interface). Estas operações só fazem sentido quando associadas às suas representações. 2

Funções como membros de estruturas Conceito de estruturas em C++ permite que funções sejam membros. Declaração da função é incluída na definição da estrutura. Define-se operações diretamente relacionadas a um TAD, exemplo: stack data, operands; // data.reset( ); operands.reset( ); Função membro (ou método) reset atribui a data.top e a operands.top o valor EMPTY. Função como membros de estruturas Se declaramos um ponteiro para uma stack: stack * ptr_operands = &operands; // ptr_operands -> push( A ); No trecho de código acima, a chamada do método push incrementa operands.top e atribui a operands.s[top] o valor A 3

Funções membro inline Funções membro, ou métodos, definidos dentro da classe são implicitamente inline. Para defini-las fora da estrutura, teríamos que utilizar o operador de escopo: struct stack // void push( char c); // prototype ou assinatura do método ; operador de escopo // void stack::push( char c ) s[++top] = c; Sobrecarga de métodos É possível também sobrecarregar métodos em uma estrutura: struct stack // char pop( ); char pop( int n ); // sobrecarga à pop( ); ; char stack::pop( int n ) while( (n-- > 1) && (_top == 0) ) _top--; return _s[_top--]; 4

Acesso público e privado O conceito de estruturas em C++ também permite a definição das formas de acesso a seus dados. IDÉIA: esconder o máximo de informação possível. Para tal são impostas certas regras para acesso a atributos e métodos de uma classe. São estabelecidos três níveis de permissão de acordo com o contexto de uso dos atributos: Privado: acesso restrito aos métodos da classe. Público: acesso a partir de objetos da classe. Protegido: acesso liberado a métodos de classes derivadas (depois). Cada um tem uma palavra reservada associada, private, public e protected respectivamente. Acesso público e privado struct controle private: int a; int f1( char* b ); protected: int b; int f2( float ); int c; float d; void f3( controle* ); ; As seções podem ser declaradas em qualquer ordem, inclusive podem aparecer mais de uma vez. 5

Membros de classes private Somente a própria classe pode acessar os atributos privados. Ou seja, somente os métodos da própria classe têm acesso a esses atributos. struct SemUso private: int valor; void f1() valor = 0; int f2() return valor; ; int main() SemUso p; p.f1(); printf("%d", p.f2() ); return 0; // cria um objeto do tipo SemUso // erro, f1 é private! // erro, f2 é private! Membros de classes public É possível fazer chamadas e manipular respectivamente métodos e atributos da classe. Para poder chamar os métodos f1 e f2 no exemplo anterior é necessário defini-los como struct SemUso private: int valor; void f1() valor = 0; int f2() return valor; ; // p.f1(); printf("%d", p.f2() ); // ok, f1 é public! // ok, f2 é public! 6

Diferença entre struct e class em C++ Ambas podem representam, em C++, um TAD A diferença está no nível de proteção, caso nenhum dos especificadores de acesso seja usado: class: por default é private struct: por default é public struct A int a; // a é público ; class B int a; // a é privado ; Exemplo: Editor Gráfico (classe círculo) círculo private public class circle double x, y; double rad; void translation( ); void scale( ); double area( ); double perim( ); atributos interface (x,y) rad 7

Exemplo: Pilha (classe stack) 3 2 1 0 21 10 8 13 private public class stack int top; int elems[50]; void push( int i ); int pop( ); int empty( ); void reset( ); atributos interface Funções e classes friend Algumas vezes duas classes são tão próximas conceitualmente que seria desejável que uma delas tivesse acesso irrestrito aos membros da outra. class point friend class circle; private: double _x, _y; point(double x, double y):_x(x),_y(y) ; class circle double rad; point cnt; circle(point c, double r): rad(r),cnt(c) void show( ) printf("x = %f\ny = %f\nr = %f\n", cnt._x, cnt._y, rad); ; 8

Funções e classes friend Em C++ funções também podem ser friend de uma classe: class Stack friend Stack* createstack(void); int top; int elems[max]; void push(int i) elems[++top]=i; int pop(void) return elems[top--]; int empty(void) return top == EMPTY; ; // Stack* createstack(void) Stack* s = new Stack; s->top = EMPTY; return s; Funções e classes friend A idéia de métodos e classes friend, no entanto, quebra um dos conceitos básicos de POO, o encapsulamento. No exemplo da classe stack seria possível uma outra construção que evitaria o uso da palavra friend. class Stack int top; int elems[max]; void push(int i) elems[++top]=i; int pop(void) return elems[top--]; void reset( ) top = EMPTY; int empty(void) return top == EMPTY; ; Stack* createstack(void) Stack* s = new Stack; s->reset( ); return s; 9

Construtores e destrutores CONSTRUTOR: É uma função membro, ou método, usado para construir um objeto de uma dada classe e é chamado automaticamente quando um objeto é instanciado. DESTRUTOR: Analogamente, é um método chamado automaticamente quando um objeto é destruído. Os construtores são importantes para manter a consistência interna do objeto. O construtor deve garantir que o objeto recém criado seja consistente. No exemplo da classe stack era necessário antes de usar o objeto, ou seja, carregar a pilha, inicializá-lo através da função reset(). Mas algum cliente incauto da classe stack poderia inserir e eliminar elementos na pilha sem antes inicializá-la o que provocaria invasão de memória. O uso de construtores elimina essa possibilidade. Construtores: classe stack class Stack pint top; int elems[max]; void reset( ) top = EMPTY; void push(int i) elems[++top]=i; int pop(void) return elems[top--]; int empty(void) return top == EMPTY; ; class Stack int top; int elems[max]; Stack( ) top = EMPTY; void push(int i) elems[++top]=i; int pop(void) return elems[top--]; int empty(void) return top == EMPTY; ; int main( ) Stack s; s.reset( ); s.push(43); int main( ) Stack s; s.push(43); 10

Construtores e destrutores: declaração Os construtores e destrutores são métodos especiais. Nenhum dos dois tem um tipo de retorno. O destrutor não pode receber parâmetros, ao contrário dos construtores. A declaração de um construtor é feita definindo-se um método com o mesmo nome da classe. O nome do destrutor é o nome da classe precedido de ~ (til). Um construtor de uma classe X é declarado como um método de nome X, o nome do destrutor é ~X. Pelo mecanismo de sobrecarga, classes podem ter mais de um construtor, ao contrário dos destrutores. Chamada de construtores e destrutores Os construtores são chamados automaticamente sempre que um objeto da classe for criado: Quando a variável é declarada (alocado na pilha) Quando o objeto é alocado com new (alocado do heap) Os destrutores de objetos alocados na pilha são chamados quando o objeto sai do seu escopo. Os destrutores de objetos criados com new são chamados com o operador delete. class A A( ) printf( construtor\n ); ~A( ) printf( destrutor\n ); ; void main() A a1; // chama construtor de a1 A *a3; A a2; // chama construtor de a2 a3 = new A; // chama construtor de a3 // chama destrutor de a2 delete a3; // chama destrutor de a3 // chama destrutor de a1 11

Exemplo: classe stack class Stack int top; int elems[max]; Stack( ) top = EMPTY; void push(int i) elems[++top]=i; int pop(void) return elems[top--]; int empty(void) return top == EMPTY; ; int main( ) Stack s; s.push(43); int main( ) Stack* s; s = new Stack; s->push(43); Construtores com parâmetros No exemplo da classe stack o cliente da classe poderia querer definir um objeto pilha com uma dimensão maior do que 50: class Stack int top; int size; char *s; Stack( ) top = EMPTY; size = max_len; s = new char[size]; Stack( int n ) // sobrecarga do construtor int main( ) top = EMPTY; size = n; s = new char[size]; Stack s1; Stack s2(2000); ~Stack( ) delete [] s; Stack *s3 = new Stack; ; Stack *s4 = new Stack(2000); 12

Construtores gerados automaticamente O fato de algumas classes não declararem construtores não significa que elas não tenham construtores. Na realidade o compilador gera dois construtores automaticamente, um default e um de cópia. Considere uma classe X: class X int a; class X int a; // X() // X(const X&); construtor vazio construtor cópia void main() X a1; // usa construtor vazio X a2(a1); // usa construtor de cópia X a3 = a2; // usa construtor de cópia Construtor de cópia Dependendo dos tipos dos atributos de uma classe, é necessário implementar explicitamente um construtor de cópia. Exemplo: class Stack int top; char *s; Stack( ); Stack( int n ); ; int main( ) stack s1(50); stack s2 = s1; ERRO! Stack::Stack( const Stack& t ) this->size = t.size; this->top = t.top; s = new char[this->size]; for(int i=0; i<top; ++i) this->s[i] = t.s[i]; 13

Métodos const Métodos const são métodos que não alteram o estado interno de um objeto. A especificação const faz parte da declaração do método: class A int value; int get ( ) return value; void put(int v) value = v; ; void f(const A a) // parâmetro a não pode ser modificado. // quais métodos de a podem ser chamados??? int b = a.get(); // Erro! método não é const Para eliminar o erro seria necessário declarar o método get como sendo const: class A int get const( ) return value; ; This Em todo método não static (depois) a palavra reservada this é um ponteiro para o objeto sobre o qual o método está executando. Todos os métodos de uma classe são sempre chamados associados a um objeto. Durante a execução de um método, os campos do objeto são manipulados normalmente, sem necessidade de referência ao objeto. A palavra this é utilizada quando se necessita manipular o próprio objeto sobre o qual o método foi chamado. 14

This - Exemplo class A int i; A& inc( ); ; // Este método incrementa o valor interno // e retorna o próprio objeto A& A::inc() // estamos executando este código para obj1 ou obj2? // como retornar o próprio objeto? i++; return *this; // this aponta para o próprio objeto void main() A obj1, obj2; obj1.i = 0; obj2.i = 100; for (j=0; j<10; j++) printf( %d\n, (obj1.inc()).i); Campos de classe static Quando uma variável é declarada static dentro de uma classe, todas as instâncias de objetos desta classe compartilham a mesma variável. Uma variável static é uma variável global, só que com escopo limitado à classe. A declaração de um campo static aparece na declaração da classe, junto com todos os outros campos. Como a declaração de uma classe é normalmente incluída em vários módulos de uma mesma aplicação via header files (arquivos.h), a declaração dentro da classe é equivalente a uma declaração de uma variável global extern. A declaração apenas diz que a variável existe; algum módulo precisa defini-la. 15

Campos static -Exemplo class A int a; static int b; // declara a variável, // equivalente ao uso de extern para // variáveis globais ; int A::b = 0; // define a variável criando o seu espaço // esta é a hora de inicializar void main(void) A a1, a2; a1.a = 0; // modifica o campo a de a1 a1.b = 1; // modifica o campo b compartilhado por a1 e a2 a2.a = 2; // modifica o campo a de a1 a2.b = 3; // modifica o campo b compartilhado por a1 e a2 printf( %d %d %d %d, a1.a, a1.b, a2.a, a2.b); // imprime 0 3 2 3 Como uma variável estática é única para todos os objetos da classe, não é necessário um objeto para referenciar este campo: A::b = 4; Métodos static Métodos static são como funções globais com escopo reduzido à classe. Isto significa que métodos static não apresentam o parâmetro this, ou seja, apenas os campos static podem ser acessados. class A int a; static int b; static void f(); ; int A::b = 10; void A::f() a = 10; // errado, a só faz sentido com um objeto b = 10; // ok, b declarado static 16