Buscar

Introdução ao C++

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

C++ 
Prof. Marco Túlio Valente 
Prof. César Francisco de Moura Couto 
Prof. Pedro Felipe 
 
2 
C++ 
§  Criada por Bjarne Stroustrup 
§  AT&T Bell Labs, a partir de 1979 
§  Objetivo: introduzir conceitos de OO em C 
§  Inicialmente, chamava-se “C com Classes” 
§  Principais conceitos de OO 
§  Classes, inclusive genéricas e abstratas 
§  Herança (simples e múltipla)‏ 
§  Polimorfismo 
§  Chamada dinâmica de métodos 
3 
Exemplo de Classe 
class Cubo { 
private: // membros privados 
 int altura, largura, prof; // atributos 
public: // membros públicos 
 Cubo (int, int, int); // função construtora 
 int volume (); // métodos 
}; 
 
Cubo::Cubo (int a, int l, int p) // Construtora 
{ altura= a; largura:= l; prof:= p } 
 
int Cubo::volume () { return altura * largura * prof; } 
 
4 
Exemplo de Classe 
main () { 
 Cubo cb (7,8,9); // declara objeto e chama construtora 
 cout << cb.volume(); 
} 
 
§  Controle de visibilidade: membros de uma classe podem 
ser 
§  public: podem ser usados em qualquer ponto do 
programa 
§  private: podem ser usados apenas em métodos da 
própria classe (visibilidade default)‏ 
§  protected: podem ser usados apenas em métodos da 
classe e de suas subclasses 
 
5 
Funções Construtora e Destruidora 
§  Função construtora: 
§  Mesmo nome da classe 
§  Chamada automaticamente na declaração de objetos 
da classe 
§  Utilizada para inicializar atributos da classe 
§  Função destruidora: 
§  Nome da classe, prefixado por ~ 
§  Chamada implicitamente quando termina o escopo de 
um objeto da classe 
§  Usada para liberar memória alocada no heap, fechar 
arquivo, fechar conexão de rede etc 
6 
Herança 
§  Mecanismo para construir novas classes (chamadas de classes 
derivadas ou subclasses) a partir de classes já existentes 
(chamadas de classes base ou superclasses)‏ 
§  Objetivo: reutilização de código (subclasse herda atributos e 
métodos da superclasse)‏ 
 
class Hora { 
 int hora, min, seg; 
public: 
 Hora (int h, int m, int s) // construtora 
 { hora= h; min= m; seg= s; } 
 void imprime () 
 { cout << hora << “:” << min << “:” << seg; } 
}; 
7 
Exemplo de Herança 
class HoraCompleta: public Hora { 
protected: 
 char *fuso; // Fuso horário: “FNO”, “BRA”, “AMZ” ou “ACR” 
public: 
 HoraCompleta (int h, int m, int s, char *fs): Hora (h, m, s) { 
 fuso= fs; 
 } 
 void imprime () { 
 Hora::imprime (); // chama imprime da superclasse 
 cout << “ “ << fuso; 
 } 
}; 
8 
Herança Múltipla 
§  Exemplo: 
class aviao { ..... } 
class barco { .... } 
class hidroaviao: public aviao, public barco 
 { .... } 
§  A subclasse hidroaviao herda todos os atributos e métodos 
de aviao e de barco. 
9 
Colisão de Nomes 
class A { class B { 
 public: void f () { .... } public: void f () { .... } 
}; }; 
 
class C: public A, public B { 
public: 
 void g () { 
 f(); // Erro ! Ambíguo, qual f ? 
 A::f (); // OK, qualificação (operador ::) com o nome 
 B::f (); // da classe remove ambigüidade 
}; 
10 
Herança Repetida 
class A { public: int x; .....}; 
class B1: public A {.... }; 
class B2: public A {.... }; 
class C: public B1, public B2 { 
public: 
 void g () { 
 x= 2; // Erro 
 B1::x= 3; // OK, cópias diferentes de x 
 B2::x= 4; // OK, cópias diferentes de x 
 } 
}; 
11 
Classe Base Virtual 
§  Classe base virtual: usada para evitar que uma superclasse 
seja herdada mais de uma vez 
 
class A { public: int x; .....}; 
class B1: public virtual A {.... }; // classe base virtual 
class B2: public virtual A {.... }; // classe base virtual 
class C: public B1, public B2 { 
public: 
 void g () { 
 x= 2; // OK 
 B1::x= 3; B2::x= 4; // OK, mesma cópia de x 
 } 
}; 
12 
Polimorfismo 
§  Um apontador para uma classe base pode apontar para um 
objeto de uma classe dela derivada 
§  Exemplo: 
 
HoraCompleta hc (15,25,18, “BRA”); 
Hora *ph; 
ph= &hc; // atribuição polimórfica 
 
§  Somente apontadores possuem tipo estático e dinâmico. 
§  Tipo Estático: tipo com que o apontador foi declarado. 
Exemplo: Hora 
§  Tipo Dinâmico: tipo para o qual o apontador se refere em 
tempo de execução. Exemplo: HoraCompleta 
§  Atribuições polimórficas alteram o tipo dinâmico de um 
apontador 
13 
Funções Virtuais 
§  Chamadas utilizando o tipo dinâmico de um apontador 
 
class Hora { .... 
 virtual void imprime () { .... } 
} 
 
class HoraCompleta: public Hora { .... 
 virtual void imprime () { .... } 
} 
 
 main () { 
 HoraCompleta hc (21, 42, 12, “BRA”); 
 Hora *ph= &hc; // atribuição polimórfica 
 ph->imprime (); // imprime: 21:42:12 BRA 
 } 
 
14 
Classes Abstratas 
§  Classes que possuem uma ou mais funções virtuais puras, 
isto é, funções que não possuem implementação 
§  Não se pode criar objetos de classes abstratas 
§  Exemplo: 
 
class Poligono { .... 
 virtual float perimetro() = 0; // função virtual pura 
} 
..... 
Poligono t; // Erro ! 
 
§  Utilização: 
§  Projeto OO 
§  Raiz de uma hieararquia de classes 
15 
Ponteiro this 
§  Toda classe possui um ponteiro de nome this, que, dentro 
de um método da classe, aponta para o objeto que está 
sendo manipulado por este método (objeto receptor). 
§  Útil quando se precisa passar o objeto receptor como 
parãmetro de um outro método 
16 
Exemplo de Uso do this 
 Pilha undo; 
 class Circulo: public Poligono { 
 int raio; ........ 
 void aumenta_tam (int dr); 
 .... 
 } 
 void Circulo::aumenta_tam (int dr) { 
 undo.empilha (*this); // salva circulo corrente na pilha de undo 
 raio= raio+dr; 
 ...... // redesenha circulo com novo tamanho 
 } 
 ................. 
 Circulo c (10); 
 c.aumenta_tam (15); 
17 
Membros Estáticos 
§  Atributo estático: atributo que pertence à classe, sendo 
compartilhado por todos os objetos da mesma. 
§  Exemplo: atributo para armazenar o número de objetos já 
criados de uma classe 
 
 class Circulo { 
 int raio; 
 static int total_circulos; // atributo estático 
public: 
 Circulo (int r); 
 void imprime(); 
}; 
 
18 
Membros Estáticos 
int Circulo::total_circulos= 0; // inicializa atributo estático 
 
Circulo::Circulo (int r) { raio= r; total_circulos++; } 
 
void Circulo::imprime () 
{ cout << "\nTotal circulos: " << total_circulos; } 
..... 
Circulo c1 (10)‏ 
Circulo c2 (27); 
c1.imprime(); 
c2.imprime(); 
19 
Métodos Estáticos 
§  Métodos Estáticos: podem ser chamados sobre a classe e 
não sobre um objeto da mesma 
§  Somente podem acessar atributos estáticos da classe 
§  Não possuem o ponteiro this 
 
 class Circulo { 
 int raio; 
 static int total_circulos; // atributo estático 
public: 
 Circulo (int r); 
 static void imprime(); // método estático 
}; 
20 
Métodos Estáticos 
int Circulo::total_circulos= 0; // inicializa atributo estático 
 
Circulo::Circulo (int r) { raio= r; total_circulos++; } 
 
void Circulo::imprime () // somente acessa atributos estáticos 
{ cout << "\nTotal circulos: " << total_circulos; } 
..... 
Circulo c1 (10)‏ 
Circulo c2 (27); 
.......... 
Circulo::imprime(); // chama método estático 
21 
Classes Genéricas 
§  Classes Genéricas: permitem parametrizar a 
implementação de classes 
§  Exemplo: pilha de inteiros 
 
class pilha { 
 int topo; int vetor [100]; 
 public: 
 pilha (); 
 void empilha (int x);int desempilha (); 
}; 
22 
Classes Genéricas 
pilha::pilha () { topo= 0; } 
void pilha::empilha (int x) { vetor [topo++]= x; } 
int pilha::desempilha () { return vetor [--topo]; } 
 
§  Mas e se pilha de float ? Ou de char ? 
§  Solução “braçal”: “copiar e colar” + “trocar” 
§  Classes Genéricas: parametrizar uma classe com um 
parâmetro de tipo 
§  “copiar e colar” + “trocar” a cargo do compilador 
§  Chamadas em C++ de templates. 
23 
Templates: Definição 
template <class T> class pilha_gen { 
 int topo; 
 T vetor [100]; 
 public: 
 pilha_gen (); 
 void empilha (T x); 
 T desempilha (); 
}; 
template <class T> pilha_gen<T>:: 
 pilha_gen () { topo= 0; } 
template <class T> void pilha_gen<T>:: 
 empilha (T x) { vetor [topo++]= x; } 
template <class T> T pilha_gen<T>:: 
 desempilha () { return vetor [--topo]; } 
 
24 
Templates: Instanciação 
void main () { 
 int i; float x; 
 pilha_gen<char> pchar; // pchar: pilha de char 
 pilha_gen<float> pfloat; // pfloat: pilha de float 
 for (i=0; i < 10; i++)‏ 
 pfloat.empilha (3.14 * i); 
 for (i=0; i < 10; i++) { 
 x= pfloat.desempilha (); 
 cout << x << “\n”; 
 } ...... 
 } 
25 
Templates: Comentários Finais 
§  Em C++, pode-se também parametrizar uma classe com 
parâmetros que não sejam tipos 
 
 template <class T, int tam> class pilha_gen { 
 int topo; T vetor [tam]; ...... 
 }

Outros materiais