330 likes | 428 Views
Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima http://allanlima.wordpress.com/. Você pode: copiar, distribuir, exibir e executar a obra criar obras derivadas fazer uso comercial da obra Sob as seguintes condições:
E N D
Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima http://allanlima.wordpress.com/
Você pode: • copiar, distribuir, exibir e executar a obra • criar obras derivadas • fazer uso comercial da obra • Sob as seguintes condições: • Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante. • Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta. • Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra. • Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor. • Veja aqui a licença completa
Roteiro • O ponteiro this • Membros estáticos • Overload de operadores • Friends • Herança
O ponteiro this • É um atributo que um método possui • Ele é um ponteiro para o objeto no qual um membro esta sendo executado. • No código, escrevemos: void Ponto::setX(floatnewX) { this->x = newX; } • Na chamada, escrevemos: Ponto p1(42.0,13); p1.setX(42.4);
O ponteiro this • Mas assinatura real é: void setX(Ponto *this, float newX) { this->x = newX; } • E quando chamamos o método: p.setX(10); • Na verdade estamos fazendo: setX(&p, 10); • Isso significa que todo método é um função
Membros Estáticos • São membros que possuem apenas uma cópia compartilhada por todos os objetos de um tipo • Podem ser métodos ou atributos: • Atributos estáticos devem ser definidos dentro da própria classe e inicializados fora dela • Métodos estáticos só podem fazer referência a atributos estáticos.
Exemplo • exemploStatic.cpp
Exercícios • Implemente uma classe Quadrado com o atributo lado, crie um construtor para ela, assim como os métodos get e set. • Qual a diferença de o corpo do método voidsetLado(float x)ser: { this->lado = lado } ou: { lado = lado; } Justifique (com um comentário no seu código) o que acontece. • Adicione ao construtor um incremento a uma variável estática que conta a quantidade de Quadrados criados. • Crie uma classe Ponto similar a da aula anterior e implemente os seguintes operadores: == != + -
Overload de Operadores • C++ permite a aplicação de alguns operadores aos tipos que nós criamos • Alguns operadores como o “=” são criados automaticamente • Porém outros devem ser implementados pelo programador • Sintaxe: • tipo operator símbolo(parâmetros);
Exemplo • exemploOperador.cpp
Overload de Operadores • C++ permite a sobrecarga dos seguintes operadores:
Exercícios • Utilize a classe Ponto do arquivo exemploPonto.cpp (similar a da aula anterior) e implemente os seguintes operadores: == != + -
Friends • Permitem a quebra dos níveis de acesso pelas palavras reservadas private e protected • Podemos ter funções, métodos ou classes friends • As declarações são feitas através da palavra reservada friend • Toda classe é friend dela mesma • Exemplo: • exemploFriend.cpp
Herança class Empregado { stringnome; float salario; int numDepartamento; int ramal; //... }; classGerente { stringnome; floatsalario; intnumDepartamento; intramal; Empregado *grupo; //... }; Precisamos mesmo repetir todos os atributos da classe Empregado na classe Gerente? E os métodos também precisamos repetir?
Herança • É um mecanismo utilizado para permitir o reuso de código • Quando uma classe B herda de uma outra classe A dizemos que B é uma sub-classe de A • Sintaxe: classNomeDaClasseFilho : publicNomeDaClassePai { //Corpo de Filho }
Herança • A solução: class Empregado { public: stringnome; float salario; int numDepartamento; int ramal; // ... }; class Gerente : public Empregado { Empregado *grupo; //.. }; Dizemos que Gerente herda de Empregado
Herança • Em C++ todos os membros public e protected da classe base são herdados normalmente • Os membrosprivatesão herdados, mas só são acessados indiretamente pelos métodos public ou protected definidos na classe base • Construtores, Destrutores, o operador = e os friendsnão são herdados
Herança • A solução: classRetangulo { private: int altura, largura; protected: intgetAltura(); public: intgetLargura(); // ... }; class Quadrado: publicRetangulo { public: voidmeuMetodo() { this->altura = 5; // errado intx = getAltura(); // ok, mas só no objeto Quadrado inty = getLargura(); // ok também no main } // ... };
Herança • Sintaxe • class nomeDaClasse : tipoDaHeranca classeBase • tipoDaHeranca: • public – Os membros public e protected da classe base são herdados por default public e protected respectivamente • private– Os membros public e protected da classe base são herdados por default private • protected–Os membros public e protected da classe base são herdados por default protected • Se tipoDaHeranca não for especificado,privateé assumido para as classes epublicpara as estruturas
Herança • Apesar dos construtores e destrutores não serem herdados, quando criamos um objeto ele chama o construtor padrão de sua classe base e também o destrutor padrão quando ele está prestes a ser desalocado da memória • Também podemos re-utilizar o código do construtor da classe base: • construtorClasse(parametros) : construtorDaSuperClasse(parametros) { ... }
Ponteiros e Herança • Podemos criar ponteiros para objetos • A inicialização é feita através do operador new ou do & • Quando usarmos o new também temos que usar o delete para liberar memória • Restrições: • Um ponteiro para um objeto da classe base só pode chamar métodos desta • Mas podemos usar casts para ter acesso aos demais métodos (ver linha 143 do próximo exemplo)
Exemplo • exemploHeranca.cpp
Herança Múltipla • C++ permite que uma classe herde de várias outras • Sintaxe: class nomeDaClasse : tipoHeranca classeBase1, // ... tipoHeranca classeBaseN • Mas isso traz problemas: • A e B possuem o método m • C herda de A e de B • O que acontece quando chamamos m de C?
Exemplo • exemploHerancaMultipla.cpp
Exercícios 2) Implemente a seguinte hierarquia de classes: Temporario Empregado Secretaria SecretariaTemp Gerente Consultor
Classe Empregado • Atributos: • Nome • E-mail • Celular • Salário • Departamento • Métodos • gets e sets • Construtor com os seu atributos
Classe Gerente • Atributos • Os empregados que gerencia • O número empregados que gerencia • Métodos • Gets e sets • Construtor com os seus atributos
Classe Secretaria • Atributos • O empregado do qual é secretaria • Métodos • Gets e sets • Construtor com os seus atributos
Classe Temporario • Atributos • A data de início do contrato • O número de meses do contrato • Métodos • Gets e Sets • Construtor com os seus atributos
SecretariaTemporaria • Métodos: • Construtor com os seu atributos
Consultor • Atributos: • Área de consultoria • Métodos • Get e sets • Construtor com os seus atributos
Referências • Stroustrup, Bjarne. The C++ Programming Language, Special Edition. • Eckel, Bruce. Thinking in C++, 2nd ed. Volume 1. • Slides de Gustavo (ghpc@cin.ufpe.br)do curso de C/C++ • www.cplusplus.com – Tutorial de Herança
Agradecimentos • Allan Lima, Breno do Vale e Francisco Magalhães • Pelo material cedido para o curso