Você está na página 1de 54

Unidade II: Linguagens de Programao

Linguagem C++ Prof. Josu Pereira de Castro Ano 2009

Origem do C++

O C++ um superconjunto da linguagem C, que foi ampliada para incorporar os conceitos da Orientao Objetos. Foi Criada por Bjarne Stroustrup. No uma linguagem puramente orientada objetos, pois permite que programas estruturados sejam tambm desenvolvidos (Linguagem Hibrida)

Origem do C++

Foi criada para permitir uma fcil migrao da programao estruturada para a orientao objetos, pois:

Permite que programadores experientes na linguagem C no tenham que aprender uma nova linguagem; Permite que programas criados na linguagem C sejam mais facilmente portados para a linguagem C++; Todo programa C vlido tambm um programa C++ Vlido (o inverso no verdadeiro)

Inovaes C++

Traz novos comandos de entrada e sada, orientados objeto. Objetos de entrada e sada:

cin: Objeto associado ao dispositivo padro de entrada (teclado); cout: objeto associado ao dispositivo padro de sada (video);

Inovaes C++

Operadores de redirecionamento:

<< : Redirecionamento de saida (da varivel para cout); >> : Redirecionamento de entrada (de cin para varivel); Exemplo: Programa ExHello.cpp

Obs: constante de fim de linha

endl: tem o mesmo efeito que \n, mas no precisa estar entre

Inovaes C++

Conversores de tipos (casting)

Forma tradicional em C (exemplo):

VarTipoA = (TipoA) VarTipoB; seja:


float Afloat; int Aint; Afloat = (float) Aint;

Forma de funo (C++)

VarTipoA = TipoA(VarTipoB); seja:


float Afloat; int Aint; Afloat = float(Aint);

Inovaes C++

Formatao de nmeros com ponto decimal com cout


Utilize os mtodos setf() e precision(): Exemplo: Programa ExFormatNum.CPP Obs: podem ser utilizadas inclusive variveis ou constantes inteiras como argumento para precision().

Inovaes C++

Parmetros por referncia implcita

O Operador & pode ser utilizado para definir parmetros por referncia implcita, ao estilo dos parmetros var da linguagem Pascal. Exemplo: programa ExRef.cpp Funes podem ser declaradas com valores default para certos argumentos, caso os mesmos no sejam passados para a funo na sua chamada. Exemplo: programa ExArgDef.cpp

Argumentos Default

Sobrecarga de Funes

So implementaes diferentes para funes conceitualmente iguais.

Exemplo: Uma funo


int soma(int a, int b) conceitualmente igual a funo float soma(float a, float b) Porm, em C estas funes teriam obrigatoriamente que ter nomes diferentes.

Em C++ estas funes podem ter o mesmo nome! Exemplo: Programa ExSbrCrg.cpp

Sobrecarga de Funes

Regras para sobrecarga de funes


(1) Somente a diferenciao dos nomes dos parmetros insuficiente para diferenciar as funes;

Exemplo:
int f(int a, int b) { ... } int f(int c, int d) { ... }

Errado! as funes acima no so consideradas como


sobrecarga, mas como redefinio!

Sobrecarga de Funes

Regras para sobrecarga de funes


(2) No se pode sobrecarregar uma funo que difere apenas no tipo de retorno;

Exemplo:
void fu(int x) { ... } int fu(int x) { ... }

Errado! Tambm no sobrecarga, mas redefinio!

Sobrecarga de Funes

Regras para Sobrecarga de Funes


(3) A utilizao de parmetros com valores default no devem causar ambigidade de interpretao;

Exemplo:
void imprimir(char *texto) { ... } void imprimir(char *texto, int nchar = 1) { ... }

Errado! A declarao acima pode confundir o compilador!

Sobrecarga de Funes

Regras para sobrecarga de funes


(4) As funes sobrecarregadas devem apresentar uma lista de parmetros diferente, com pelo menos um tipo de parmetro diferente, um nmero de parmetros diferente ou ambos; (5) O tipo de retorno pode ser diferente, se a regra (4) for respeitada;

Obs: A sobrecarga tambm conhecida como Polimorfismo de Funo

Gabaritos de Funes (Templates)

Templates (ou gabaritos):

So uma forma mais compacta de codificar funes sobrecarregadas que realizam a mesma funo sobre um mesmo conjunto de dados, os quais podem aparecer com tipos diferentes durante a escrita de um programa; A funo declarada com um tipo de dado em aberto, o qual substitudo em tempo de compilao pelo tipo de dado adequado cada situao; Exemplo: Programa ExTempFunc.cpp

Alocao Dinmica em C++

feita com os operadores new e delete

Operador new:

Realiza a alocao de memria; equivalente funo malloc() em C uma palavra reservada em C++, e no uma funo, como no C; Tem uma sintaxe mais simples e enxuta; No necessrio informar o tamanho a ser alocado usando sizeof(); o tamanho verificado automaticamente por new; No necessrio formatar o ponteiro resultante com a realizao de um cast;

Alocao Dinmica em C++

Exemplo em C

Exemplo em C++
int main() {// Aloca um ponteiro para um double double *ptr; ptr = new double; ... }

int main() { // aloca um ponteiro para um double double *ptr; ptr = (double*) malloc(sizeof(double)); ... }

Alocao Dinmica em C++


Sintaxes possveis para o operador new:

Como operador:
ptr_tipo = new tipo; exemplo:
int *ptrInt = new int;

Alocao de Vetores:
ptr_tipo = new tipo[tamanho_vetor]; exemplo:
int *ptrInt = new int[10];

Como funo:
ptr_tipo = new(tipo); exemplo:
int *ptrInt = new(int);

Alocao de vetores de ponteiros:


ptr_ptr_tipo = new tipo*[Tamanho_vetor]; exemplo:
int **ptrInt = new int*[10];

Alocao Dinmica em C++

Operador delete

Realiza a liberao da memria alocada com o operador new; Formas de utilizao:

Desalocar um nico ponteiro: delete ptr; Desalocar um vetor: delete [] ptr;

Exemplo: Programa ExAlocDin.cpp

Classes em C++

Definio e declarao de classe

Sintaxe de definio de classe:


class NomeClasse{ tipo_de_acesso: tipo_1 nome_dado_membro1; ... tipo_n nome_dado_membro_n; prottipo funo1 ... prottipo funo m

} Exemplo: Programa ExCls.cpp

Acesso aos membros de uma classe

Qualificadores de Acesso

private:

Membros nesta seo podem ser acessados somente por funes membros declaradas dentro da prpri classe; o default quando nenhum qualificador especificado; membros nesta seo podem ser acessados por funes membros dentro da mesma classe e por funes membros de classes derivadas; membros nesta seo podem ser acessados por qualquer funo dentro do escopo de definio da classe.

protected:

public:

Membros de uma Classe

Atributos:

Podem ser qualquer tipo de dado, simples ou compostos, ou mesmo outras classes previamente definidas; So quaisquer funes definidas dentro de uma classe e que podem manipular os dados membros de uma classe;

Funes membro (ou mtodos):

Construtores e Destruidores

So funes que atuam implicitamente sobre os objetos no momento de sua declarao (construtores) e de sua destruio (destrutores). Construtores:

Servem para inicializar os dados membros de uma classe durante a sua declarao; Sintaxe:

No deve apresentar tipo de retorno (nem void); O nome do construtor deve ter o mesmo nome da classe a que pertence.

Construtores e Destruidores

Construtores Especiais

Construtor Default:

Quando uma classe no possui construtores definidos, o compilador cria um construtor sem cdigo e sem parmetros que chamado em cada declarao de instncia; Quando definimos pelo menos um construtor para uma classe, este construtor default no gerado! O construtor default qualquer construtor sem parmetros, seja gerado pelo compilador ou definido pelo programador;

Construtores e Destruidores

Construtor de Cpia

usado quando desejamos declarar um objeto e inicializa-lo com os valores guardados em um outro objeto j existente da mesma classe; Sintaxe:
Nome_Classe(Nome_Classe &Obj, ...);

Onde:

Obj uma referncia ao objeto que deve ser copiado para o objeto criado

As reticncias indicam que podem existir outros parmetros, mas estes devem ter valores default; Exemplo: Programa ExCls.cpp.

Construtores e Destruidores

Destruidores

So funes complementares s funes construtoras de uma classe; So executadas automaticamente quando o escopo de durao do objeto encerra-se; So responsveis por arrumar a casa depois que um objeto no mais usado (servem para desalocar memria alocada, liberar qualquer recurso, etc, visando garantir uma saida limpa; Cada classe pode ter apenas um destruidor;

Construtores e Destruidores

Sintaxe:

Na definio da classe:
class Nome_Classe { ... tipo_acesso: ~Nome_Classe(); }

Obs:

A funo destruidora no pode receber parmetros. A funo destruidora, assim como as construtoras, no pode ter nenhum tipo de retorno (nem void). Se voc no definir um destruidor, o compilador lhe fornecer um destruidor default, sem cdigo.

Arrays de Objetos

Assim como possvel se construir arrays de qualquer tipo de dados (simples ou compostos), possvel definir arrays de objetos (Lembre-se, Objetos so ADTs (Abstract Data Types Tipos Abstratos de dados TADs);

Exemplo: programa ExArrayObj.cpp

Friends

So funes externas uma dada classe que possuem a capacidade de poder acessar seus membros privados ou protegidos; Podem ser de dois tipos:

Funes friends no-membros de classe; Funes Friends membros de outras classes;

Friends

Funes friends no membros de classe

So, geralmente, funes genricas de manipulao de dados s quais desejamos enviar atributos de uma classe; Sintaxe da definio de uma friend no membro:
class Nome_Classe{ ... tipo_acesso:
...

friend prottipo_funo; };

Exemplo: Programa ExFunFriend.cpp

Friends

Funes Friends membros de outras classes

So utilizadas quando necessrio se implementar uma conexo direta entre duas classes; Sintaxe da definio de uma friend membro de outra classe:
class Nome_Classe{ ... tipo_acesso: ... friend outra_classe::prottipo_funo_membro; };

Exemplo: Programa ExMemFriend.cpp

Trata-se de uma classe que pode ter acesso aos dados membros internos de outra classe

Classes Friends

Sintaxe de definio
class A { ... }; class B { ... tipo_acesso: ... friend class A; } //// definio da classe A // definio da classe A

Exemplo: Programa ExClassFriend.cpp

Classes Friends

Comutatividade em classes friends:


A relao de amizade no comutativa! Se a classe A friend da classe B ento A pode acessar os dados privados de B, porm B no pode acessar os dados privados de A; Em resumo:

Quem declara a amizade sofre o acesso

Classes Friends

Transitividade em classes friends

A relao de amizade no transitiva, ou seja:

Se A friend de B, e B friend de C, isto no implica que A friend de C!

Sobrecarga de Operadores

o mecanismo da linguagem C++ que permite a redefinio ou sobrecarga dos operadores da linguagem para permitir que certas operaes possam ser escritas de forma natural. Consiste no acrscimo de significados operadores j existentes na linguagem. aos

Sobrecarga de Operadores

Operadores Sobrecarregveis:

Todos os operadores da linguagem C++ (incluindo new e delete) podem ser sobrecarregados, com exceo dos listados abaixo:

. .* :: ?:(operador ternrio)

Restries na sobrecarga

No se podem criar novos operadores alm dos j existentes na linguagem; O operador sobrecarregado no pode alterar as regras de precedncia e associatividade estabelecidas na sua definio original Ao menos um dos parmetros da funo operadora dever ser objeto de classe

Restries na sobrecarga

Sobrecarga de Operadores

No se pode combinar sobrecargas para gerar uma terceira funo operadora.

Exemplo: a sobrecarga do operador + e a sobrecarga do operador = no geram automaticamente uma sobrecarga para o operador += !

Os seguintes operadores s podem ser sobrecarregados com funo operadora membro de classe:

Atribuio [=] Apontador-membro [->] Parnteses [()]

Sobrecarga de Operadores

Formas de se implementar a sobrecarga:

Como funo membro de classe; Como funo friend de classe;

Sobrecarga de Operadores

Sobrecarga como funo membro:

Sintaxe de declarao:

class Nome_classe{ ... tipo_retorno operator op(lista de parmetros); };

Sintaxe de definio:

tipo_retorno Nome_Classe::operator op(lista de parmetros{ // corpo da funo }

Exemplo: Programa ExOverMem.cpp

Sobrecarga de Operadores

Sobrecarga como funo friend:

Sintaxe de declarao:
class Nome_classe{ ... friend tipo_retorno operator op(lista de parmetros);

} Sintaxe de definio:
tipo_retorno operator op(lista de parmetros) { // corpo da funo }

Exemplo: Programa ExOverFri.cpp

Herana

O C++ implementa os seguintes mecanismos de herana:

Herana simples: As classes so derivadas a partir de uma nica classe-base; Herana mltipla: as classes podem ser derivadas a partir de vrias classes-bases;

Herana

Herana simples:

Em C++ implementada a partir de uma declarao de hereditariedade, na qual a classe derivada declara sua classebase, o modificador de acesso da herana e a seguir declara seus membros particulares; Sintaxe:
class Nome_classe:[modificador] Nome_classe_base { // declarao dos membros da classe derivada }

Herana

Na sintaxe anterior:

O operador : especifica a declarao de herana; O modificador especifica a relao de acesso que a classe base ter com a classe derivada; Exemplo: Programa ExHeranca.cpp

Herana

Modificadores de Acesso:

Especificam o modo como as classes derivadas tm acesso sua classe-base; Os dois modificadores de acesso possveis em C++ so:

Public private

Herana

Transmissividade de Acesso em Hierarquias:

Tipo de acesso Modificador de acesso Tipo de acesso Na Classe Base Na Herana Resultante Public Public Public Private Public Inacessvel Protected Public Protected Public Private Private Private Private Inacessvel Protected Private Private

Herana

Construtores e Destruidores na Herana

Uma classe derivada pode ter seus prprios construtores e destruidores, independentemente da sua superclasse; As classes derivadas no herdam os construtores e destruidores das superclasses; Cabe ao programador decidir como os construtores e destruidores das classes derivadas se realcionam com os das superclasses;

Herana

Relacionamentos entre construtores de classes derivadas e superclasses:

Podem ser implcitos ou explcitos;

Relacionamentos Implcitos: Caso nada seja especificado pelo programador, o construtor da classe derivada realiza uma chamada implcita ao construtor default da superclasse; Relacionamentos Explcitos: Deve ser especificada na definio do construtor da classe derivada. A sua sintaxe :

Nome_Classe_Derivada(parmetros_da Classe_derivada, Parmetros_da_Superclasse): Nome_Classe_base(Parmetros_da_classe_base) {// Definio da funo}

Herana

Destrutores em Herana Simples:

A ordem de chamada dos destrutores ocorre em ordem inversa ordem de chamada dos construtores; Os destrutores das superclasses so chamados de forma implcita;

Herana

Substituio ou sobrescrita de mtodos (Overriding):

o mecanismo que permite que classes derivadas possam modificar mtodos que so herdados das classes bases para introduzir alteraes na sua forma de funcionamento, sem no entanto alterar a sua interface; A funo subrescrita (ou substituida) deve combinar em tipo de retorno, nome e lista de parmetros com a funo antecessora na classe base. Exemplo: Programa ExOverriding.cpp

Herana

Herana Mltipla:

Ocorre quando uma classe derivada possui duas ou mais classes base; utilizada quando se precisa combinar caractersticas de duas ou mais classes diferentes em uma nica classe; Sintaxe:
class Nome_classe:[modificador_1] Classe_Base_1, [modificador_2] Classe_Base_2, ..., [modificador_n] Classe_Base_n { // Declarao dos membros da classe};

Exemplo: Programa ExHeraMult.cpp

Herana

Ambigidade em herana mltipla:

Quando duas ou mais classes bases possuem atributos ou mtodos homnimos, e a classe derivada no sobrescreveu estes atributos ou mtodos, isto pode causar ambigidade. Para evit-la, pode-se utilizar o operador de resoluo de escopo para referir-se ao mtodo classe base correta que se deseja referenciar.

E/S em Arquivo

Arquivos em C++

O C++ permite a extenso do direcionamento de fluxo das classes streams para o armazenamento e recuperao de dados em arquivos. Programas que manipulam arquivos em C++ devem incluir o cabealho
#include <fstream.h> que contm as definies das classes que manipulam arquivos

E/S em Arquivo

Classes da biblioteca fstream para manipulao de arquivos:


ifstream: para manipulao de arquivos de entrada; ofstream: para manipulao de arquivos de sada; fstream: para manipulao de arquivos de entrada e sada;

E/S em Arquivo

Abertura e Fechamento de arquivos:

So efetuadas atravs de funes membro das classes da biblioteca. Exemplo:


Programa ExFileMan.cpp Programa ExFileMan2.cpp

FIM