33
+ Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima http://allanlima.wordpress.com/

+ Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

Embed Size (px)

Citation preview

Page 1: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+

Curso de C/C++

Aula 7

Instrutor: Luiz Felipe Sotero

Material por: Allan Lima

http://allanlima.wordpress.com/

Page 2: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

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

Page 3: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Roteiro

O ponteiro this

Membros estáticos

Overload de operadores

Friends

Herança

Page 4: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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(float newX) {

this->x = newX;

}

Na chamada, escrevemos:

Ponto p1(42.0, 13);

p1.setX(42.4);

Page 5: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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

Page 6: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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.

Page 7: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploStatic.cpp

Page 8: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exercícios

1) Implemente uma classe Quadrado com o atributo lado, crie um construtor para ela, assim como os métodos get e set.

a) Qual a diferença de o corpo do método void setLado(float x) ser:

{

this->lado = lado

}

ou:{

lado = lado;

}

Justifique (com um comentário no seu código) o que acontece.

b) Adicione ao construtor um incremento a uma variável estática que conta a quantidade de Quadrados criados.

2) Crie uma classe Ponto similar a da aula anterior e implemente os seguintes operadores:

==!=+-

Page 9: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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);

Page 10: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploOperador.cpp

Page 11: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Overload de Operadores

C++ permite a sobrecarga dos seguintes operadores:

Unários: + - * ! ~ & ++ -- () -> ->*

new delete

Binários: + - * / % & | ^ << >>

= += -= /= %= &= |= ^= <<= >>=

= = != < > <= >= && || [] () ,

Page 12: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exercícios

2) Utilize a classe Ponto do arquivo exemploPonto.cpp (similar a da aula anterior) e implemente os seguintes operadores:

==!=+-

Page 13: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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

Page 14: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Herança

class Empregado {

string nome;

float salario;

int numDepartamento;

int ramal;

//...};

class Gerente {

string nome;

float salario;

int numDepartamento;

int ramal;

Empregado *grupo;

//...

};

Precisamos mesmo repetir todos os atributos da classe Empregado na classe Gerente?

E os métodos também precisamos repetir?

Page 15: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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:

class NomeDaClasseFilho : public NomeDaClassePai

{

//Corpo de Filho

}

Page 16: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Herança A solução:

class Empregado {

public:

string nome;

float salario;

int numDepartamento;

int ramal;

// ...

};

class Gerente : public Empregado {

Empregado *grupo;

//..

};

Dizemos que Gerente herda de Empregado

Page 17: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Herança

Em C++ todos os membros public e protected da classe base são herdados normalmente

Os membros private são herdados, mas só são acessados indiretamente pelos métodos public ou protected definidos na classe base

Construtores, Destrutores, o operador = e os friends não são herdados

Page 18: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Herança A solução:

class Retangulo {

private: int altura, largura;

protected: int getAltura();

public: int getLargura();// ...};

class Quadrado: public Retangulo { public: void meuMetodo() { this->altura = 5; // errado int x = getAltura(); // ok, mas só no objeto Quadrado int y = getLargura(); // ok também no main }// ... };

Page 19: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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 e public para as estruturas

Page 20: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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) { ... }

Page 21: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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 destaMas podemos usar casts para ter acesso aos

demais métodos (ver linha 143 do próximo exemplo)

Page 22: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploHeranca.cpp

Page 23: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+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 mC herda de A e de BO que acontece quando chamamos m de C?

Page 24: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exemplo

exemploHerancaMultipla.cpp

Page 25: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Exercícios

2) Implemente a seguinte hierarquia de classes:

Empregado

Secretaria

GerenteSecretariaTemp

Temporario

Consultor

Page 26: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Classe Empregado

Atributos:

NomeE-mailCelularSalárioDepartamento

Métodos

gets e setsConstrutor com os seu atributos

Page 27: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Classe Gerente

Atributos

Os empregados que gerenciaO número empregados que gerencia

Métodos

Gets e setsConstrutor com os seus atributos

Page 28: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Classe Secretaria

Atributos

O empregado do qual é secretaria Métodos

Gets e setsConstrutor com os seus atributos

Page 29: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Classe Temporario

Atributos

A data de início do contratoO número de meses do contrato

Métodos

Gets e SetsConstrutor com os seus atributos

Page 30: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+SecretariaTemporaria

Métodos:

Construtor com os seu atributos

Page 31: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Consultor

Atributos:

Área de consultoria Métodos

Get e setsConstrutor com os seus atributos

Page 32: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Referências

Stroustrup, Bjarne. The C++ Programming Language, Special Edition.

Eckel, Bruce. Thinking in C++, 2nd ed. Volume 1.

Slides de Gustavo ([email protected])do curso de C/C++

www.cplusplus.com – Tutorial de Herança

Page 33: + Curso de C/C++ Aula 7 Instrutor: Luiz Felipe Sotero Material por: Allan Lima

+Agradecimentos

Allan Lima, Breno do Vale e Francisco Magalhães

Pelo material cedido para o curso