Apostila CPP PDF
Apostila CPP PDF
Apostila CPP PDF
APOSTILA de L3GO
Linguagem de 3a Gerao Orientada a
Objetos - C++
Aulas Tericas
Adelailson Peixoto
Aulas Tericas de C/C++ Adelailson Peixoto
1-INTRODUO LINGUAGEM C
1.1-INTRODUO
Linguagens de Programao:
C uma linguagem de mdio nvel, pois combina elementos de linguagens de alto nvel com a
funcionalidade de linguagens de baixo nvel.
Anlise/Projeto
Dados (Dicionrio de Dados)
Algoritmo (Diagramas, Pseudo-cdigos)
Implementao
Linkedio
2
Aulas Tericas de C/C++ Adelailson Peixoto
1.3- SMBOLOS
Separadores so smbolos que separam outros smbolos. Ex.: caracter branco ( ), tabulao (\t),
pula linha(\n), etc.
Identificadores palavras criadas pelo programador p/ denotar objetos. Para tal, permitido o uso
de letras, sublinhados e dgitos. Ex.: Maria, x, x10, x_10.
3
Aulas Tericas de C/C++ Adelailson Peixoto
Exemplo de um programa em C:
Exemplos.:
4
Aulas Tericas de C/C++ Adelailson Peixoto
Escopo o local do programa onde um nome visvel e pode ser utilizado. O escopo comea na
declarao do nome e termina no fim da regio do programa onde o nome foi declarado.
Nome Local declarado dentro de um bloco (comando estruturado ou funo). O nome somente
pode ser referenciado de dentro do bloco.
Nome Global declarado fora das funes. A referncia ao nome comea na sua declarao e
termina no final do arquivo.
2.3 VARIVEIS
Ex.: int x;
char maiscula, minscula = a;
float a = 4.8;
int soma = 0, dif = -10;
5
Aulas Tericas de C/C++ Adelailson Peixoto
2.4 OPERADORES
6
Aulas Tericas de C/C++ Adelailson Peixoto
7
Aulas Tericas de C/C++ Adelailson Peixoto
Especificadores de Formato:
8
Aulas Tericas de C/C++ Adelailson Peixoto
if (<expresso>)
<bloco1>;
[else
<bloco2>;
]
<expressao> deve retornar um valor verdadeiro (diferente de 0) ou um valor falso (igual a 0). Caso
o valor seja verdadeiro, apenas o bloco1 ser executado. Caso o valor retornado seja falso, apenas o
bloco2 ser executado (se a estrutura contiver o else). Exemplos:
Obs.: Se <bloco1> ou <bloco2> for composto por mais de um comando, deve estar entre chaves.
No exemplo abaixo, como h trs comandos condicionados ao if, ento devem estar entre chaves.
...
if ((x%2)==0)
{
printf (%d e par, x); //comando 1
x = x+10; //comando 2
y+=x; //comando 3
}
...
9
Aulas Tericas de C/C++ Adelailson Peixoto
Outra forma de usar o switch, incluindo o comando break, dentro de cada case:
switch (<expresso>)
{ - O uso do break faz com que s o bloco do case, onde a
case <constante1>: expresso igual a constante seja executado.
<bloco1>; - Isto por que quando o break executado o comando switch
break; deixa de ser executado.
case <constante2>:
<bloco2>;
break;
...
[default:
<bloco_default>;]
}
Exemplo:
//Programa switch case EUA:
printf (Estados Unidos\n);
#include <stdio.h> break;
#define BRASIL 0 case FRANCA:
#define EUA 1 printf (Franca\n);
#define FRANCA 2 break;
default:
void main (void) printf (Pais Invalido\n);
{ int x;
scanf (%d,&x); } //fim do switch
switch(x) }//fim da main
{
case BRASIL:
printf (Brasil\n);
break;
10
Aulas Tericas de C/C++ Adelailson Peixoto
Nas duas estruturas acima, a condio de sada do lao (ou seja a expresso atingir o valor falso)
deve ser controlada dentro do bloco
for ( [expre1]; [expre2]; [expre3] ) expre1 - faz todas as iniciaes do lao for.
{ expre2 - a condio testada. Se for verdadeira o bloco
<bloco>; continua a ser executado. Se for falsa a execuo sai do
} lao.
expre3 usada para atualizar dados, de modo que a
condio de sada da expre2 seja atingida.
Obs.: O comando break tambm pode ser utilizado dentro das 3 estruturas acima (alm do switch),
como mais uma condio de sada do lao.
11
Aulas Tericas de C/C++ Adelailson Peixoto
5 MODULARIZAO EM SUBPROGRAMAS
5.1 FUNES
tipo-retorno o tipo do valor que o comando return devolve (caso no seja void).
nome-funcao o identificador da funo.
lista-de-parametros o conjunto de parmetros passados funo. Cada parmetro separado por
vrgula e seu tipo deve ser especificado.
Exs.:
void Par_ou_Impa (int x) int LerMaior (int x, int y)
{ {
if ((x%2)==0) printf (numero %d par, x); if ( x>y) return x;
else printf (numero %d impar, x); else return y;
} }
Obs.: -Se o tipo-retorno no for especificado, o compilador assume que ser retornado um inteiro.
Ex.; A declarao int funo(void); equivale declarao funo(void);
12
Aulas Tericas de C/C++ Adelailson Peixoto
Exemplo 1: Exemplo 2:
// Programa Imprimir Dobro/Triplo // Programa Imprimir Dobro/Triplo
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
void ImprimeAteDobro(void); void ImprimeAteDobro (int x);
void ImprimeAteTriplo(void); void ImprimeAteTriplo (int x);
int x;
void main( void )
void main( void ) {
{ int x;
clrscr( ); clrscr( );
printf(Entre com um inteiro:\n ); printf(Entre com um inteiro:\n );
scanf( %d\n, &x); scanf( %d\n, &x);
ImprimeAteDobro(); ImprimeAteDobro (x);
ImprimeAteTriplo(); ImprimeAteTriplo (x);
} }
void ImprimeAteDobro(void) void ImprimeAteDobro (int x)
{ {
int i=2*x; int i=2*x;
for ( ; x<=i; x++) for ( ;x<=i; x++)
printf(%d\n,x ); printf(%d\n,x );
} }
void ImprimeAteTriplo(void) void ImprimeAteTriplo (int x)
{ {
int i=3*x; int i=3*x;
for ( ; x<=i; x++) for ( ; x<=i; x++)
printf(%d\n,x ); printf(%d\n,x );
} }
13
Aulas Tericas de C/C++ Adelailson Peixoto
14
Aulas Tericas de C/C++ Adelailson Peixoto
6 VETORES
Vetor - coleo de va riveis de mesmo tipo que referenciada por um nome comum. Um elemento
especfico em um vetor acessado atravs de um ndice.
6.1 PONTEIROS
Um ponteiro uma varivel que armazena endereos de outras variveis. Um ponteiro tem
normalmente o tamanho de uma varivel inteira.
Operadores * e &
No exemplo acima, p=&x faz com que p receba o endereo de x (aponte para x), ou seja o valor de
p passa a ser 200, que corresponde posio de memria 200, onde se encontra a varivel x. No
trecho printf(%d, *p), *p indica o valor da varivel para a qual p aponta (varivel x) e ser
impresso o valor 10. Na segunda impresso, printf(%d, p), ser impresso o valor de p (endereo
de x), ou seja 200.
15
Aulas Tericas de C/C++ Adelailson Peixoto
A passagem de parmetros por referncia feita atravs do uso de ponteiros. O exemplo abaixo
mostra uma funo CalculaDobro que recebe uma varivel x (por valor) e uma varivel dobro (por
referncia) que retornar com o dobro de x. A funo principal mostra uma chamada desta funo
com os seus respectivos parmetros reais
16
Aulas Tericas de C/C++ Adelailson Peixoto
No se pode passar um vetor completo como parmetro real em uma chamada de funo. O que
passado apenas o endereo do vetor (ponteiro para o primeiro elemento).
importante observar que a passagem de vetores como parmetros descrita acima, permite que os
elementos do vetor sejam alterados de dentro da funo (passagem por referncia). Para evitar esta
possibilidade deve-se utilizar o modificador const antes de parmetro formal (vetor). O uso do
const permite que o vetor seja apenas lido de dentro da funo (passagem por valor).
#define MAX 12
float y[MAX]; /*Est Correto */
6.4 - STRINGS
-strcpy
char *strcpy (char *str_dest, const char *str_orig);
Copia o contedo de str_orig para str_dest. A string str_orig deve ser terminada com \0. Retorna
um ponteiro para str_dest.
17
Aulas Tericas de C/C++ Adelailson Peixoto
-strcat
char *strcat (char *str_dest, const char *str_orig);
Concatena uma cpia de str_orig para str_dest e finaliza str_dest com o caracter nulo \0. O
caracter nulo, que originalmente finalizava str_dest, sobreposto pelo primeiro caracter de str_orig.
Retorna um ponteiro para str_dest.
-strcmp
int strcmp (const char *str1, const char *str2);
Valor significado
<0 str1 menor do que str2
=0 str1 igual a str2
>0 str1 maior do que str2
-strlen
size_t strlen (const char *str);
Devolve o comprimento (nmero de caracteres) de str, terminada pelo caracter nulo \0. O nulo no
contado.
Exemplo:
#include <stdio.h>
#include <string.h>
if (!strcmp(s1,s2))
printf (As strings sao iguais\n);
strcat (s1,s2);
printf (%s\n,s1);
strcpy(s1,Isto um teste.\n);
printf (%s\n, s1);
}
18
Aulas Tericas de C/C++ Adelailson Peixoto
7 CONSTRUTORES DE TIPOS
-O nome do tipo possui escopo global quando criado for a das funes e possui escopo local
quando criado dentro de alguma funo. Ex.:
interessante observar que um tipo tambm pode ser definido com #define. Por exemplo
#define inteiro int, pode ser usado em vez de typedef int inteiro. Porm, importante lembrar que
qualquer smbolo definido com #define possui escopo global.
19
Aulas Tericas de C/C++ Adelailson Peixoto
So construtores de tipos (tipo de dados simples), definido pelo usurio, que consiste de uma lista
de elementos com nomes constantes.
Declarao de variveis
Se o tipo foi criado SEM typedef: Se o tipo foi criado COM typedef:
enum <nome_tipo> <nome_var>; (em C) <nome_tipo> <nome_var>;
<nome_tipo> <nome_var>; (em C++)
Exemplos:
t_x y,z; //y e z sao variaveis gobais do tipo t_x void main (void)
{
void main (void) t_dia dia; //dia uma variavel do tipo t_dia
{ t_lim lim; //lim uma variavel do tipo t_lim
x=a;
y=j; dia = seg;
z = k; lim = sup;
} }
20
Aulas Tericas de C/C++ Adelailson Peixoto
So construtores que definem tipos e/ou variveis compostos por um conjunto de variveis (tipo de
dados composto). Para cada elemento do conjunto alocado um espao exclusivo na memria.
Cada elemento chamado de campo.
Declarao de variveis
Se o tipo foi criado SEM typedef: Se o tipo foi criado COM typedef:
struct <nome_tipo> <nome_var>; (em C) <nome_tipo> <nome_var>;
<nome_tipo> <nome_var>; (em C++)
Exemplos:
21
Aulas Tericas de C/C++ Adelailson Peixoto
Tipo e/ou varivel definido pelo usurio que pode conter valores de diferentes tipos (tipo
composto), em momentos diferentes. Semelhante struct, exceto que a alocao de memria feita
apenas para o maior campo.
Declarao de variveis
Se o tipo foi criado SEM typedef: Se o tipo foi criado COM typedef:
union <nome_tipo> <nome_var>; (em C) <nome_tipo> <nome_var>;
<nome_tipo> <nome_var>; (em C++)
Exemplos:
22
Aulas Tericas de C/C++ Adelailson Peixoto
8.2-REA DE DADOS
8.3-REA DE PILHA
-rea que possui os endereos das variveis locais, endereos de retorno das chamadas de funes e
endereos dos parmetros formais.
-Cada vez que uma funo chamada reservada uma rea, a partir da qual so resolvidos os
endereos das variveis locais, do valor de retorno e dos parmetros.
-As variveis locais possuem nome, que usado para referenci-las no programa.
-O endereo de cada varivel alocado no incio da execuo da funo, onde a varivel est
declarada e s liberado no fim da execuo da funo.
Exemplo:
23
Aulas Tericas de C/C++ Adelailson Peixoto
8.4-REA DE HEAP
-Regio de memria livre, que o programa pode usar via funes de alocao dinmica. Nesta rea
so alocadas as variveis dinmicas.
-O endereo da varivel resolvido pela rotina de alocao dinmica, chamada explicitamente pelo
prprio programa.
-As variveis dinmicas no possuem nome (por isso so tambm chamadas de variveis
annimas) e so referenciadas unicamente por ponteiros.
-A alocao e liberao de endereos so feitas em quaisquer pontos do programa, de forma
desestruturada. Exemplo:
8.5 PONTEIROS
Operadores de Ponteiros
-Operador new
Tenta alocar dinamicamente (em tempo de execuo) uma varivel ou um vetor. Retorna o
endereo do objeto alocado. Se no conseguir alocar, retorna NULL. Ex.:
float * x; int * y;
x = new float; y = new int[5];
24
Aulas Tericas de C/C++ Adelailson Peixoto
-Operador delete
Libera uma area de memria previamente alocada com new. Ex.:
delete x; /* usado para um nico objeto*/
delete []y; /* usado para vetores */
Obs.: eliminar um vetor com a sintaxe delete simples ou eliminar um objeto com a sintaxe delete[]
tem efeito indefinido.
-Operador *
Possui duas finalidades:
a)Em uma declarao de varivel, especifica que a varivel ponteiro
b)Devolve o valor da varivel (contedo) localizada no endereo armazenado. Ex.:
int *p;
p = new int;
*p = 38;
-Operador &
Devolve o endereo de memria do seu operando. Ex.:
int *p, m; int *p, **q;
p = &m; q = &p;
-Operador ++ e
Incrementam ou decrementam uma posio de memria de acordo com o tipo de dado da varivel
alocada nesta posio. Ex.:
int *p;
float *q;
-Lixo: uma varivel dinmica dinmica para a qual ningum aponta. Ex.:
int * x,* y; * y=20;
* x=10; y=x;
x = new int;
y = new int;
25
Aulas Tericas de C/C++ Adelailson Peixoto
-Referncia Solta: uma varivel annima destruda antes que todos os ponteiros p/ essa varivel
sejam destrudos. Ex.:
int *x, *y; y = x;
x = new int; delete x;
*x=10 ;
Exemplos de Erros
-Deve -se sempre perguntar se h espao suficiente ao se tentar alocar memria dinamicamente. Ex.:
-Pode -se percorrer um vetor alocado dinamicamente tanto usando o ndice dos elementos quanto
usando aritmtica de endereo.
26
Aulas Tericas de C/C++ Adelailson Peixoto
9 MODIFICADORES DE TIPOS
Neste caso, modificador pode alterar os valores literais, o acesso e o armazenamento da varivel
nome_var. Os modificador aqui estudados sero:
Modificam os valores literais que os tipos bsicos (int, char, float e double) podem receber. Os
modificadores de tipos bsicos podem ser:
Os modificadores de sinal signed e unsigned indicam que o conjunto de valores literais que uma
varivel pode assumir podem respectivamente conter sinal e no conter sinal. So aplicados aos
tipos char e int. Vejamos os exemplos:
int x; //x ocupa 16 bits e pode assumir 65.536 valores distintos: de 32.767 a 32.767
unsigned int x; //x ocupa 16 bits e pode assumir 65.536 valores distintos: de 0 a 65.535
signed int x; //o mesmo que int x.
char y; //y ocupa 8 bits e pode assumir 256 valores distintos: de -127 a 127
unsigned char y; //y ocupa 8 bits e pode assumir 256 valores distintos: de 0 a 255
signed char y; //o mesmo que char y. Observe que signed redundante
Os modificadores de tamanho short e long alteram o espao necessrio para armazenar as variveis.
O short pode ser aplicado a int e o long pode ser aplicado a int e a double. Ex.:
int x; //ocupa 16 bits e pode assumir 65.536 valores distintos: de 32.767 a 32.767
long int x; //ocupa 32 bits (4.294.967.296 valores distintos): de -2.147.483.647 a 2.147.483.647
short int x; //o mesmo que int x.
unsigned long int x; //ocupa 32 bits (4.294.967.296 valores distintos): de 0 a 4.294.967.295
double z; //ocupa 64 bits, com dez dgitos de preciso
long double z; // ocupa 128 bits, com dez dgitos de preciso
27
Aulas Tericas de C/C++ Adelailson Peixoto
register
Declarar uma varivel como register significa solicitar ao compilador que, caso seja possvel,
armazene a varivel diretamente em um dos registradores da CPU. Isto otimiza o acesso varivel.
Apenas variveis locais (incluindo parmetros formais) podem ser declaradas como register. Ex.:
register int i; //i acessada muitas vezes no lao, por isto, se for declarada como
for (i=0; i<MAX; i++) // register seu acesso ser otimizado.
{ . }
static
A classe static pode ser aplicada a variveis locais e globais. Em cada um dos dois caso, a
interpretao do uso de static diferente.
Quando utilizada em variveis locais, a classe static indica que o valor da varivel mantido entre
as chamadas da funo onde ela est declarada. Isto acontece porque variveis locais static so
armazenadas na rea de dados e no na rea de pilha. Sua alocao feita na primeira vez que for
feita uma chamada funo onde ela est declarada. S ua desalocao s feita ao final da execuo
do programa. Apesar de ser alocada na rea de dados, seu escopo continua sendo local, ou seja, s
pode ser acessada de dentro da funo onde est declarada. Ex.:
Neste exemplo, como a varivel total foi declarada como static, seu valor ser mantido cada vez
que for feita uma chamada funcaoX dentro da main.
Quando utilizada em variveis globais, a classe static indica que as variveis s podem ser
utilizadas no aquivo onde forma declaradas. Para uma melhor assimilao da idia da classe static,
podemos dizer que, quando aplicada a variveis locais, as variveis so alocadas na rea de dados e
s so acessveis de dentro da funo onde esto declaras. Quando aplicadas a variveis globais, as
variveis so alocadas na rea de dados e s so acessveis de dentro do arquivo onde foram
declaradas.
28
Aulas Tericas de C/C++ Adelailson Peixoto
extern
Este modificador indica que o espao de armazenamento (e possivelmente o valor inicial) de uma
varivel j foi resolvido em outro arquivo. Uma varivel s pode ser declarada como extern se ela
no foi definida como static em outro arquivo.
O extern aviso ao compilador de que ele no preciso resolver a alocao de uma varivel (ou seja
definir a varivel), pois isto j foi decidido em outro arquivo. O uso do extern indica apenas uma
declarao da varivel e no uma definio da mesma (alocao de memria).
Analisemos o exemplo:
arquivo1.c arquivo2.c
int a=1; int a;
int b =1; extern double b;
extern int c; extern int c;
Obs1.: Se for encontrada a decla rao de uma varivel em um nico arquivo e o extern for
utilizado, o compilador, apenas neste caso, resolve o endereamento e alocao da varivel.
Obs2.: importante observar que uma declarao seguida de atribuio significa uma tentativa de
alocar espao para a varivel. Portanto, como o uso extern implica em no alocao de espao, no
permitido declarar uma varivel com extern e atribuir a ela um valor. Exceto se a varivel no
existir em nenhum outro arquivo, conforme obs1.
Ex.:
arquivo1.c arquivo2.c
int a=1; extern int a; //correto pois a s alocada no arquivo 1
int b; extern int b=3; //errado, pois est tentando alocar b nos dois arquivos
extern int c=1; //correto, pois c s est declarada no arquivo1, logo ser alocada .
29
Aulas Tericas de C/C++ Adelailson Peixoto
Observaes:
O uso de static e extern podem ser estendidos a funes. Quando uma funo definida como
static, indica que s possvel fazer chamadas a ela no arquivo onde ela foi definida. O exemplo
abaixo mostra a declarao de uma funo com static.
Ex.: arquivo1.c
static void funcao(void);
Uma funo definida em um arquivo1 pode ser chamada em um arquivo2, bastando que no
arquivo2 ela seja declarada como extern. Ex.:
arquivo1.c arquivo2.c
int a=1; extern int a;
extern int func1(void) ;
int func1(void)
void main (void) {
{ return 2*a;
int b = func1(); }
printf (%d\n, b);
}
Neste exemplo a funo func1 definida no arquivo2. A declarao desta funo no arquivo1
apenas um aviso ao compilador de que no necessrio resolver a alocao para func1, pois isto j
foi resolvido em outro arquivo. A varivel a foi alocada apenas no arquivo1.
30
Aulas Tericas de C/C++ Adelailson Peixoto
10 ARQUIVOS (TEXTO)
O tipo FILE uma estrutura que permite que um arquivo armazenado no disco rgido possa ser
acessado por uma varivel da memria RAM, durante a execuo do programa. Para tal
necessrio que seja decla rado um ponteiro da seguinte forma:
FILE *arq;
A varivel nome_arquivo indica o nome do arquivo, que deve incluir a pasta onde o aqruivo se
encontra. Ex.: C:\\AulasPuc\L3GO\\Aulas.txt. Se o nome da pasta no for especificado,
pressupem-se que o arquivo esteja no diretrio corrente, de onde o programa est sendo executado.
FILE *arq;
arq=fopen (C:\\AulasPuc\L3GO\\Aulas.txt,r);
if(arq==NULL)
printf(Nao foi possivel abrir o arquivo);
31
Aulas Tericas de C/C++ Adelailson Peixoto
32
Aulas Tericas de C/C++ Adelailson Peixoto
arq=fopen (C:\\AulasPuc\L3GO\\Aulas.txt,r);
if(arq==NULL){
printf(Nao foi possivel abrir o arquivo);
return;
}
fscanf(arq, %d,%d,%f,&x,&y,&z);
33
Aulas Tericas de C/C++ Adelailson Peixoto
34
Aulas Tericas de C/C++ Adelailson Peixoto
11.1 INTRODUO
- Orientao a objetos (OO) um paradigma de programao que oferece um nvel mais alto de
abstrao. Promove modelos mais prximos do mundo real.
- Cada objeto forma uma unidade que contm informaes da estrutura e do comportamento do
objeto.
- A estutura est relacionada aos dados e o comportamento est relacionado s operaes.
Dados
Objeto
Operaes
Em C++ :
class aluno{
private:
int matricula;
char nome[100];
char endereco[100];
char data_nasc[8];
int curso;
float notas[10];
public:
void IncluirDadosPessoais (int mat, char *nom, char * end, char *nas);
void Matricular (int mat, int curs);
void AlterarEndereco (char *end);
void IncluirNotas (float *not);
void EmitirHistorico (void);
};
35
Aulas Tericas de C/C++ Adelailson Peixoto
Controle de
Fluxo e
Reusabilidade Legibilidade Modificabilidade Execuo
Desvios Estruturas Subprogramas Eventos Objetos
Incondicionais de Controle
Estruturas de Funes e Mover o mouse,
Repetio, Procedimentos. Apertar um
Condicionais. Boto.
Objeto- uma entidade que possui estrutura de dados e comportamento encapsulados juntos em
uma unidade. Em um programa, um objeto uma varivel.
36
Aulas Tericas de C/C++ Adelailson Peixoto
Mtodo Construtor- Mtodo utilizado para iniciar automaticamente os dados das instncias de
uma classe. Possui o mesmo nome da classe. No possui retorno e chamado no momento que a
instncia criada.
Mtodo Destrutor- Mtodo utilizado para destruir automaticamente os dados das instncias de
uma classe. Possui o mesmo nome da classe, precedido de ~. No possui retorno e chamado no
momento que a instncia liberada.
class professor{
private:
char nome[100];
char endereco[100];
float salario;
public:
professor (void);
void AtualizarDadosPessoais (const char *n, const char *end);
void AtualizarSalario (float s);
void LerDadosPessoais (char *n, char *end);
float LerSalario (void);
};//fim da definicao da classe
professor::professor (void)
{
strcpy (nome, Novo Professor);
strcpy (endereco, Rua X);
salario = 0.0;
}
void professor::AtualizarDadosPessoais (cons char *n, const char *end)
{
strcpy (nome, n);
strcpy (endereco, end);
}
void professor::AtualizarSalario (float s)
{
salario = s;
}
void professor::LerDadosPessoais (char *n, char *end)
{
strcpy (n, nome);
strcpy (end, endereco);
}
float professor::LerSalario (void)
{
return salario;
}
37
Aulas Tericas de C/C++ Adelailson Peixoto
Obs1.: Os mtodos construtores declarados sem passagem de parmetros formais, ou seja com
void, so denominados de mtodos construtores default. Cada vez que um objeto criado, o
mtodo construtor default automaticamente chamado.
Obs2.: Os mtodos cuja implementao ocorre dentro da definio da classe so chamados mtodos
inline . Se o mtodo inline, ento, durante a compilao, as chamadas aos mtodos (mensagens
enviadas aos objetos) so substitudas pela sua implementao e, portanto, durante a execuo, no
h uso da rea de pilha para armazenar as variveis locais destes mtodos.
11.3- ENCAPSULAMENTO
A partir do princpio do encapsulamento definido Tipo Abstrato de Dados: tipo de dados que
contm a representao e as operaes em uma mesma unidade de encapsulamento. Uma classe
um Tipo Abstrato de Dados!
38
Aulas Tericas de C/C++ Adelailson Peixoto
11.4 HERANA
um dos princpios da O.O., no qual classes compartilham atributos e servios de classes pr-
existentes, evitando assim que seja projetado e implementado um cdigo j existente. um
mecanismo para organizao, construo e uso de classes reusveis.
A mesma estrutura, utilizando herana, onde pessoa uma superclasse e professor, aluno e
funcionrio so trs subclasses de pessoa:
Nome AtualizarEndereo
Endereo IncluirDadosPessoais
Nasc LerDadosPessoais
39
Aulas Tericas de C/C++ Adelailson Peixoto
#include <string.h>
#define MAX_DISC 10
#define MAX_STR 100
pessoa::pessoa (const char *nom, const char *end, const char *d_nasc)
{ strcpy (nome ,nom);
strcpy (endereco, end);
strcpy (nasc, d_nasc);
}
void pessoa::LerDadosPessoais (char *n, char *end, char *d_nasc)
{ strcpy (n, nome);
strcpy (end, endereco);
strcpy (d_nacs, nasc);
}
public:
professor (const char *n, const char *e, const char *dn, int g,int a );
void IncluirGrau (int g) {grau = g};
void IncluirDisciplinas (int nd, const int *disc)
{ n_disc=nd;
for(int i=0; i<n_disc; i++) disciplinas[i]=disc[i];
}
void IncluirArea (int a) {area=a;}
void LerDadosAcademicos (int *g, int *disc, int *a);
};//fim da definicao da classe
professor::professor (const char *n, const char *e, const char *dn, int g,int a):pessoa(n,e,dn)
{ grau = g;
40
Aulas Tericas de C/C++ Adelailson Peixoto
area=a;
n_disc=0;;
for (int i=0; i<MAX_DISC; i++) disciplinas[i]=0;
}
void professor:: LerDadosAcademicos (int *g, int *disc, int *a)
{
*g=grau; *a= area;
for (int i=0; i<n_disc; i++) disc[i]=disciplinas[i];
}
public:
aluno (const char *n, const char *e, const char *dn, int m,int c );
void Matricular (int nd, const int *d);
void IncluirNotas (const int *n) { for (int i=0; i<n_disc; i++) notas[i]=n[i];}
int LerMatricula (void) {return matricula;}
int LerCurso (void) {return curso;}
void LerNotasDisc (int *n, int *d);
}//fim da definicao da classe
aluno::aluno(const char *n, const char *e, const char *dn, int m,int c):pessoa(n,e,dn)
{ matricula = m;
curso = c;
n_disc=0;
for (int i=0; i<MAX_DISC; i++) { disciplinas[i]=0; notas[i] =0;}
}
41
Aulas Tericas de C/C++ Adelailson Peixoto
private:
float salario;
int depto;
int cargo;
public:
funcionario (const char *n, const char *e, const char *dn, float s,int d, int c );
void AlterarSalario (float s) {salario =s;}
void AlterarDepto (int d) {depto =d;}
void AlterarCargo (int c) {cargo = c;}
float LerSalario (void) {return salario;}
int LerDepto (void) {return depto;}
int LerCargo (void) {return cargo;}
}//fim da definicao da classe
funcionario::funcionario (const char *n, const char *e, const char *dn, , float s,int d, int c):
pessoa(n,e,dn)
{ salario = s;
depto = d;
cargo = c;
}
private: dados ou operaes definidos como private s podem ser acessados dentro da prpria
classe, ou seja, por outros campos definidos dentro da prpria classe..
protected: dados ou operaes definidos como protected s podem ser acessados ou dentro da
prpria classe ou dentro das suas classes derivadas.
public: dados ou operaes definidos como public podem ser acessados em qulauqe instruo,
externa ou interna classe. Ou seja campos public podem ser acessados de qualquer parte do
programa.
De acordo com as definies acima, uma classe derivada D de uma classe base B no tem acesso
aos seus campos privados, sendo necessrias, portanto, definies de mtodos pblicos em B, para
que D acesse (indiretamente) seus dados privados.
42
Aulas Tericas de C/C++ Adelailson Peixoto
No exemplo de herana, visto acima, as classes professor, aluno e funcionario foram definidas
como derivadas de pessoa, de forma publica. O texto :public pessoa, escrito logo aps o nome de
cada classe derivada, diz ao C++ que as propriedades herdadas devem manter o seu status original,
ou seja, o que era public na classe base deve permancer public na classe derivada e o que era private
deve continuar private. Se o texto utilizado fosse :private pessoa, ento as classes derivadas
herdariam todos os campos da classe base de forma privada. Seja o exemplo abaixo:
A varivel a privada da classe A, logo s pode ser acessada de dentro da classe A. A funo
funcaoA pblica, logo pode ser acessada fora da classe A. As classes B e C so derivadas da
classe base A. Logo um objeto da classe B tem dois dados (a e b ) e duas operaes (funcaoA e
funcaoB) e um objeto da classe C tambm tem dois dados (a e c ) e duas operaes (funcaoA e
funcaoC). Lembre-se que o dado a , apesar de constar nos objetos das classes derivadas, no podem
ser acessados de dentro destas.
43
Aulas Tericas de C/C++ Adelailson Peixoto
44
Aulas Tericas de C/C++ Adelailson Peixoto
45
Aulas Tericas de C/C++ Adelailson Peixoto
11.5 POLIMORFISMO
1700 campo 1
campo 2 6000 xxxxxx 6300 xxxxxx 6500 xxxxxx
xxxxxx xxxxxx xxxxxx
5000 xxxxxx xxxxxx xxxxxx
Objeto2 Mtodo1 Mtodo2 Mtodo3
46
Aulas Tericas de C/C++ Adelailson Peixoto
Na figura acima existem trs mtodos virtuais e seus endereos esto guardados na tabela de
mtodos virtuais. Quando os objetos 1 e 2 so alocados , o endereo da tabela de mtodos virtuais
associado a eles.
Mtodo Abstrato Mtodo virtual que no est definido (implementado) . apenas declarado.
Para definir um mtodo virtual em C++, basta atribuir zero em sua declarao.
A criao de um mtodo abstrato em uma superclasse significa que a implementao deste mtodo
s ser definida nas subclasses.
Classe Abstrata- Classe que contm pelo menos um mtodo abstrato. Uma classe abstrata no
pode conter instncias diretas.
Atributo Classe Atributo que contm informaes globais da classe. No pode ser referenciado
diretamente a partir de nenhuma instncia da classe, ou seja, referenciado diretamente pela prpria
classe. Para definir um atributo classe, em C++, deve-se declar-lo com static.
Mtodo Classe Mtodo que trata (acessa) os atributos classe. Em C++, um mtodo classe deve
ser decla rado com static.
47
Aulas Tericas de C/C++ Adelailson Peixoto
class shape{
public:
virtual void Draw(void) =0; //Mtodo Abstrato, logo shape classe abstrata!
};
//-----------------------------------------------
class circle: public shape{
public:
virtual void Draw(void) ;
};
//-----------------------------------------------
class square: public shape{
public:
virtual void Draw(void) ;
};
//-----------------------------------------------
class line: public shape{
public:
virtual void Draw(void) ;
};
//-----------------------------------------------
Perceba que nenhuma instncia criada do tipo shape. Isto no possvel, pois shape classe
abstrata.
48