Escolar Documentos
Profissional Documentos
Cultura Documentos
14/11/12 17:02
Pgina 1 de 27
14/11/12 17:02
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1)
2)
3)
4)
Sumrio
Resumo................................................................................................. 4
1
Introduo................................................................................. 5
2.1
2.2
2.3
2.4
2.5
2.5.1
2.5.2
A construo if........................................................................................................ 8
Blocos e escopos.................................................................................................... 9
2.5.3
2.5.4
A construo for..................................................................................................... 9
As construes while e do....................................................................................... 9
2.5.5
2.5.6
2.5.7
2.5.8
O operador ?........................................................................................................ 11
C++ tem label e goto, mas no contem para ningum............................................ 11
2.6
2.6.1
2.6.2
2.6.3
2.6.4
Tratamento de excees........................................................................................ 12
3.1
3.2
Vetores................................................................................................................ 13
Funes............................................................................................................... 13
3.3
3.3.1
Estruturas........................................................................................................... 14
struct..................................................................................................................... 14
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 2 de 27
3.3.2
3.3.3
union..................................................................................................................... 14
enum..................................................................................................................... 14
3.4
3.5
typedef................................................................................................................ 14
Ponteiros............................................................................................................. 15
3.6
3.7
Constantes.......................................................................................................... 16
Os quatro tipos de cast....................................................................................... 16
3.8
3.9
Referncias......................................................................................................... 17
Ponteiros para estruturas................................................................................... 17
3.10
Alocao de Memria........................................................................................ 17
4.1
4.1.1
Orientao a Objetos......................................................................................... 18
Teoria................................................................................................................... 18
4.2
4.3
Controle de Acesso............................................................................................ 18
Construtores e destrutores................................................................................ 19
4.4
4.5
Sobrecarga de operadores................................................................................. 20
Membros estticos e constantes....................................................................... 20
4.6
4.6.1
Herana de classes............................................................................................. 20
Classes base e derivada......................................................................................... 21
4.6.2
4.6.3
Membros protected.............................................................................................. 21
Construtores.......................................................................................................... 21
4.6.4
4.6.5
4.6.6
Funes virtuais..................................................................................................... 21
Funes virtuais puras e classes abstratas............................................................... 21
Herana mltipla.................................................................................................... 22
5.1
5.1.1
5.1.2
Regras e recomendaes................................................................................... 23
Algumas regras de programao............................................................................ 23
Algumas regras bsicas de formatao................................................................... 23
5.2
5.3
5.4
Programao em mdulos.................................................................................. 24
Listas encadeadas por herana e com ponteiros.............................................. 24
Relaes do tipo um e tem um................................................................ 25
14/11/12 17:02
Templates e STL..................................................................... 26
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 3 de 27
14/11/12 17:02
Resumo
Esta apostila material de apoio a um curso de extenso ministrado pelo professor Marcelo de
Olieira Johann na UFRGS, em agosto de 2004. O curso eminentemente prtico, com exemplos que
demonstram os recursos e funcionalidades sendo oferecidos pelo professor, alterados em sala de aula, e
com a proposio de exerccios para os alunos, a serem realizados durante a aula e como trabalhos extraclasse de fixao de contedo.
Devido extenso e complexidade dos recursos oferecidos pela linguagem C++, o curso tem uma
abordagem seletiva de contedos, e prioriza o desenvolvimento da habiliade de programao produtiva
com um subconjunto adequadamente selecionado destes recursos. Outros recursos oferecidos pela
linguagem, como sobrecarga de operadores, herana mltipla, programao de algoritmos em templates,
so apresentados pela sua definio, objetivo, forma geral, mas no trabalhados em detalhe, permitindo
que os alunos se concentrem em um modelo orientado a objetos e no se dispersem com a complexidade e
detalhes de todas as opes da linguagem..
Palavras-chave: Programao, Linguagens, C++
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 4 de 27
14/11/12 17:02
1 Introduo
A linguagem C++ foi desenvolvida inicialmente por Bjarne Stroustrup na AT&T, de 1979 a 1983,
partir da linguagem C, tendo como idia principal a de agregar o conceito de classes, de orientao
objetos, quela linguagem. Razo porque iniciamente chamva-se de C com classes. Bjarne procurou
tanto quanto possvel manter retrocompatibilidade com C, de modo que programas em C pudessem ser
compilados por um compilador C++ com um mnimo de alteraes. Entretanto, encarar C++ como um
superconjunto de C um erro, e C++ deve ser vista como uma outra linguagem, por diversas razes.
Em primeiro lugar, nem todo o programa escrito em C compilado em C++ sem erros, e pode nem
mesmo gerar o mesmo resultado, j que a sintaxe e a semntica de algumas construes diferem. Ao ligarse partes de um programa em C++ com partes em C, estas devem ser bem especificadas, pois as
convenes de funcionamento do cdigo compilado tambm diferem. Alm disso, C++ oferece um
conjunto de mecanismos bsicos que no estavam presentes em C, e estes devem ser usados para produzir
software mais modular e confivel explorando-se as verificaes disponveis no compilador. Finalmente,
os mecanismos de C++ devem inspirar a programao segundo o paradigma de orientao a objetos e,
portanto, no se deve programar em C++ como se faz em C.
A partir da primeira verso de 1983, a linguagem foi sendo revisada e evoluindo, tornou-se
disponvel fora da AT&T em 1985, e aps um longo processo foi padronizada pela ISO no final de 1997,
pelo padro ISO/IEC 14882. Voc pode obter mais informaes sobre o desenvolvimento da linguagem
na pgina do prprio autor em [STR 2004].
STL uma parte do padro C++, e consiste em uma biblioteca de funes e estruturas de dados que
todo compilador C++ deve oferecer, prov as implementaes mais comuns em um programa, e pode-se
utiliz-la com diferentes tipos de dados. Um bom ponto de partida para leitura especfica sobre STL na
pgina da Silicon Graphics, Inc. em [STL 2004].
De forma geral, possvel obter muito material de referncia da linguagem atravs de pginas na
Internet. Tente por exemplo pesquisar com a expresso C++ reference no Google. Tambm muito
produtivo criar o hbito de pesquisar por problemas bem especficos. Tente, por exemplo, pesquisar
iostream.h iostream difference, ou STL hash_map code example. Pode-se obter cursos [BRA 1998],
livros e exemplos de cdigo [ECK 2000]
Os compiladores do projeto GNU tambm podem ser obtidos livremente atravs da Internet. O
ambiente BloodShed Dev-C++ roda sobre Windows e utiliza os compiladores gcc e g++. possvel
baix-lo de: http://www.bloodshed.net/devcpp.html. H tambm inmeros fruns e listas de discusso
sobre aspectos tcnicos da linguagem. Ento, use e abuse da Internet para aprend-la e resolver seus
problemas.
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 5 de 27
14/11/12 17:02
Pgina 6 de 27
14/11/12 17:02
qualquer lugar.
chapter2/2.2-01-declaration.cpp
A tabela 1 apresenta os tipos de dados bsicos da linguagem, exemplos de valores literais, e
intervalos de valores aceitos. Cada tipo de dado possui representao de valores literais adequados, tanto
para inicializao quanto para atribuies. Em geral usa-se bool, char, int, long e double mais
freqentemente, onde long uma abreviao para long int.
bool
char
int
float
double
Valores booleanos
Caracteres simples
Nmeros inteiros
Nmeros reais
Reais dupla preciso
true false
a A + \t \n
100 0x3F
1.2f .23f 1.f 1.5e-15f
1.2 .23 1. 1.5e-15
true false
0 a 255, isto , 8 bits
16 bits ou mais, 32 normal
H quatro modificadores que alteram a representao desses tipos bsicos. Os modificadores signed
e unsigned alteram o significado dos dados para representao de nmeros negativos. Os modificadores
short e long alteram a quantidade de bits com que o dado representado. A linguagem no padroniza
completamente o tamanho da representao binria de nmeros, e esse um aspecto que pode
comprometer a portabilidade.
Assim como C, C++ uma linguagem que permite programao em baixo nvel. Assim, a
linguagem no possui propriamente caracteres, mas o tipo char apenas um nemro de no mnimo 8 bits,
e os literais (a,X) podem ser atribudos a qualquer varivel numrica.
chapter2/2.2-02-declaration.cpp
Um tipo de dado pode ser convertido em outro tipo com um cast. O cast deve preceder um valor e
consiste no tipo para o qual se deseja converter, entre parnteses, como, por exemplo: (int) a. Esse cast
simples introduzido aqui o mesmo da linguagem C, mas deve-se evitar utiliz-lo, pois em seu lugar C++
possui outros quatro tipos diferentes de cast que so mais seguros, a serem apresentados adiante.
chapter2/2.2-03-charcast.cpp
Pgina 7 de 27
14/11/12 17:02
vetor de inteiros, assinala valores a algumas posies, e as imprime. Vetores sero melhor estudados
adiante, mas so aqui introduzidos para enriquecer os exemplos iniciais.
chapter2/2.4-01-vetor.cpp
A construo if
A construo if tem a seguinte sintaxe, sendo opcional a parte do else em diante:
if (condio) comando_para_resultado_verdadeiro; else comando_para_falso;
Exerccios:
12-
Escreva um programa que l um valor da linha de comando e diz se ele par ou mpar.
Escreva um programa que recebe a nota final de um aluno e imprime seu conceito,
conforme a tabela abaixo:
de 9 a 10
de 7,5 a 9
de 6 a 7,5
de 0 a 6
3-
2.5.2
A
B
C
D
Blocos e escopos
Se for necessrio colocar mais de um comando aninhado dentro de uma construo condicional (ou
de iterao) usa-se um bloco. Um bloco uma construo que permite tratar um conjunto de comandos
como se eles fossem um s. O bloco consiste nesse conjunto de comando entre chaves ( {, }). Um
bloco define um escopo de variveis. Isto significa que se uma nova varivel declarada dentro de um
bloco com o mesmo nome de uma varivel fora desse bloco, somente a varivel interna acessada desse
ponto em diante at o final do bloco.
2.5.3
A construo for
A construo for serve para fazer repeties, e bastante flexvel ao contrrio da maioria das
linguagens. ela composta por 4 elementos, identificados assim:
for ( expr1; expr2; expr3 ) comando;
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 8 de 27
14/11/12 17:02
2.5.4
1-
2-
As construes while e do
2.5.5
1-
2-
A declarao break interrompe o comando de repetio mais interno dentro da qual ela se encontra.
Serve tambm para separar casos da construo switch, vista adiante. J a declarao continue interrompe
apenas uma das repeties do lao, passando diretamente execuo da prxima repetio.
Exerccios:
1-
Escreva um programa que l dez valores e os imprime em ordem inversa aps a leitura.
Porm a leitura deve ser interrompida caso um valor negativo seja lido, imprimindo
"VALOR INCORRETO".
2-
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 9 de 27
14/11/12 17:02
A construo switch
A construo switch serve para testar uma varivel ou expresso contra diversos valores constantes.
Casa valor deve aparecer separado em uma clusula case. E cada clusula case precisa ser interrompida
por uma declarao break, caso contrrio os comandos deste ponto em diante sontinuam sendo
executados.
Exerccios:
1-
2.5.7
Escreva um programa que leia valores entre 0 e 100 indefinidamente e calcule sempre a
mdia atual. Deve ser impresso "Mdia ok", "Mdia insatisfatria" e "Mdia insuficiente"
respectivamente, para valores nos intervalos [80-100], [60-79] e [0-59]. Caso o valor lido
no seja um nmero entre 0 e 100, abortar o programa com uma mensagem de erro
O operador ?
O par de operadores ? : funciona como a construo condicional if, mas sob a forma de expresso.
Isto , esse operador retorna um valor, o valor da expresso que foi avaliada. Um exemplo de uma
expresso com esse operador, j usada em um assinalamento, a seguinte:
int a = (b>10) ? 10 : b;
2.5.8
Assim como C, C++ tambm possui o comando goto, que desvia a execuo do programa para um
label que identifica uma outra linha de cdigo. Deve-se evitar ao mximo o uso desse recurso, pois ele
quebra a estrutura do programa em termos de iteraes, condies e blocos. Entretanto, ele pode ser bem
utilizado para gerao automtica de cdigo, como, por exemplo, na implementao de autmatos.
Namespaces
Namespaces servem para separar espaos de nomes em mdulos e bibliotecas inteiras, evitando que
nomes de variveis, estruturas, funes e classes conflitem. Os namespaces so abertos, isto , podem ser
declarados vrias vezes, cada qual acrescentando novos elementos dentro do mesmo namespace.
chapter2/2.6-01-namespace.cpp
2.6.2
Strings em C++ e em C
Em C uma string apenas um vetor de caracteres terminado por \0 (valor binrio zero). Sendo um
vetor, ele caracterizado pelo seu endereo inicial. Esse endereo pode ser constante, quando foi
declarado como vetor ou literal, ou varivel, quando declarado como ponteiro. Nesse ltimo caso, ele
deve ser inicializado para apontar para uma rea de memria com a string, seja ela constante, de outro
vetor, ou alocada dinamicamente. Ocasionalmente ser necessrio usar esses vetores de caracateres em
C++, mas a linguagem C++ tem objetos do tipo string com muitas operaes convenientes e fceis de
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 10 de 27
14/11/12 17:02
usar. Atribuio, cpia e concatenao, que somente podem ser feitas por funes em C, so feitas apenas
com = e + em C++, por exemplo.
chapter2/2.6-02-strings.cpp
2.6.3
Os exemplos a seguir mostram como se faz entrada e sada de dados em C e C++. O primeiro
apresenta exemplos de entrada e sada de dados formatados por console, enquanto o segundo programa
apresenta leitura de arquivos em C e C++.
chapter2/2.6-03-io.cpp
chapter2/2.6-04-files.cpp
2.6.4
Tratamento de excees
Para que serve tratamento de excees? Em programas pequenos, seu uso pode no ser justificado,
pois tudo que eles oferecem pode ser obtido com um simples teste (if) aps a realizao de uma operao.
Mas em programas grandes, o local onde uma situao de erro, ou exceo ao funcionamento desejado,
identificada pode no ter uma relao direta com o local onde essa situao deve ser tratada. Por exemplo,
para uma funo que procura por um valor em um vetor, no encontr-lo uma exceo. Mas quem a
chamou pode estar simplesmente consultando o vetor justamente para saber se o elemento est l, e nesse
caso a resposta negativa uma situao normal. Ao contrrio, se a chamada parte de uma funo que
colocou esse valor e precisa dele para continuar, o fato de no estar l pode ser um erro gravssimo, e
necessitar um relato ao usurio e interrupo do programa. Essas diferenas de tratamento podem ocorrer
entre funes que foram chamadas em vrios nveis, inclusive com diferentes funes tendo diferentes
interpretaes, aes e mensagens para a mesma situao. por isso que um mecanismo simples de testes
e codificao de retorno se torna inapropriado para a tarefa.
O mecanismo de tratamento de excees da linguagem serve justamente para isso. Ele especifica o
registro de uma situao de exceo, e o desvio para um local que declara trat-lo diretamente, cruzando
as fronteiras de funes e controle de fluxo (mas fazendo as operaes necessrias de desativao dessas
funes, como um retorno prematuro). No disparo da exceo, possvel passar quaisquer informaes ao
tratamento. Aqui utilizado um nmero inteiro apenas, mas ser tipicamente um objeto de uma classe
exceo em uma aplicao real.
chapter2/2.6-05-try.cpp
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 11 de 27
14/11/12 17:02
3.1 Vetores
J foi vista a declarao e uso de vetores simples. Se um vetor tem inicializao, pode-se omitir seu
tamanho entre os colchetes, e ele ser calculado pleo nmero de elementos da inicializao. Se o tamanho
do vetor declarado, pode-se inicializ-lo com menos valores do que seu tamanho, e os restantes
recebero 0, mas no se pode inicializ-lo com mais valores do que seu tamanho. No possvel assinalar
ou copiar vetores inteiros. Outras caractersticas de vetores so melhor compreendidas adiante com
funes e ponteiros.
chapter3/3.1-00-matrix.cpp
chapter3/3.1-01-matrix1.cpp
3.2 Funes
Uma funo agrupa um conjunto de comandos da linguagem, podendo esse conjunto ser chamado
de vrias partes de um programa. Funes servem para economizar cdigo-fonte e organizar melhor um
programa. Uma funo possui um nome, um tipo de valor de retorno, e um conjunto, possivelmente vazio,
de parmetros de entrada, cada um com seu tipo especfico. Esses elementos caracterizam uma assinatura
da funo, que, para ser completa, deve ser seguida de sua implementao, ou corpo. Um prottipo de
uma funo uma definio com o corpo omitido, e se utiliza esse recurso para declarar previamente uma
funo e fazer seu nome conhecido antes de dar sua implementao.
Ao contrrio de C, em C++ pode-se ter vrias funes com exatamente o mesmo nome, desde que
os tipos ou nmero de parmetros de entrada variem. Chama-se isso de sobrecarga de funes. Embora
se possa utilizar esse recurso arbitrariamente, ele faz sentido para dar verses diferentes de uma mesma
funo que esto disponveis para diferentes parmetros de entrada. As funes em C++ podem ter
parmetros com valores default. No caso de argumentos para esses parmetros serem omitidos na
chamada os valores default so utilizados. Somente pode ser omitido o valor de um parmetro se todos os
outros sua esquerda tambm tiverem sido omitidos.
O qualificador inline, utilizado antes da declarao de uma funo, faz com que o cdigo dessa seja
substitudo no lugar da chamada, se possvel, para que o programa rode mais rapidamente. Em C isso
deve ser implementado com a substituio textual das macros (#define).
Como exerccio, experimente escrever um programa que imprime os nmeros de 1 a 10 atravs de
um lao, mas sem usar as construes for ou while, e sim com chamada de funo recursiva. Este
exerccio demonstra que pode-se utilizar o paradigma de programao funcional em uma linguagem como
C++, onde todo programa expresso como um conjunto de funes aplicadas umas s outras.
Programao funcional mais do que isso, mas a semelhana existe.
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 12 de 27
14/11/12 17:02
3.3 Estruturas
O programador deve modelar o problema que deseja resolver ou processar utilizando-se de
algoritmos e estruturas de dados. Do ponto de vista de recursos de linguagem, alguns recursos so
oferecidos para facilitar a descrio dessas estruturas. De fato, um deles possui exatamente esse nome, de
estrutura, mas nada mais do que um agregado de valores.
3.3.1
struct
Em C++, uma estrutura um tipo de dado conhecido pela linguagem. Assim, ela entende a todas as
antigas formas de declarao de C, e adicionalmente o nome da estrutura pode ser diretamente utilizado
sem o prefixo struct.
chapter3/3.3-01-struct.cpp
3.3.2
union
Uma unio apenas uma estrutura onde todos os campos utilizam a mesma posio. Ela pode ser
utilizada para dar diferentes interpretaes a uma rea de memria, ou armazenar de forma compacta
dados mutuamente excludentes.
3.3.3
enum
Uma enumerao um novo tipo de dado que possui valores discretos especficos. Pode-se declarar
uma enumerao para o tipo dia, e uma varivel do tipo dessa enumerao poder ter os valores: segunda,
terca, e assim por diante. Uma enumerao nada mais do que um nmero inteiro para o qual so dados
nomes especficos a alguns valores. De fato, pode-se definir exatamente quais so esses valores. As
enumeraes servem para organizao interna do cdigo, mas quando seu valor impresso, interpretado
apenas como nmero.
3.4 typedef
A declarao typedef define um novo tipo de dado tendo como base um tipo conhecido. Por
exemplo, pode-se fazer:
typedef int int32;
typedef short int16;
E a partir de ento passar a usar somente int16 e int32 nas declaraes de um programa. Se esse
programa for portado para outra mquina e compilador onde int tem s 16 bits, pode-se redefinir int32
como long apenas em uma posio.
3.5 Ponteiros
Todas as variveis esto armazenadas em memria. Cada uma tem seu endereo e seu contedo.
Quando usamos o nome de uma varivel num programa, o compilador compila no cdigo o endereo,
para que, quando executado, o processador acesse o contedo. Isso significa que o compilador s v o
endereo e o programador s v o contedo. Para ver o endereo, usa-se o operador & na frente da
varivel, que significa endereo de, e chamado operador de referenciao. Ao contrrio, para
manipular um valor armazenado em um endereo, usa-se o operador * na frente do endereo, que
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 13 de 27
14/11/12 17:02
chapter3/3.5-01-pointer.cpp
chapter3/3.5-02-pointer.cpp
Uma boa sugesto para aprendizagem declarar outras variveis e vetores e imprimir seus valores e
contedos. Utilize os programas abaixo para fazer essas experincias, incluindo fazer atribuies s
variveis que so ponteiros e s variveis apontadas por elas. Sempre considere que as variveis locais
aparecem em ordem inversa na memria, pois so criadas na pilha do sistema, e que existem regras de
alinhamento, e, portanto, variveis declaradas consecutivamente podem aparecer separadas por espaos
para satisfazer tais regras.
3.6 Constantes
A palavra const um qualificador, assim como signed ou short, e serve em primeiro lugar para dar
nome a valores constantes posteriormente usados no programa. J que a varivel no pode ser
posteriormente atribuda, toda declarao de const deve ter inicializao.
Mas o significado de const um pouco mais sutil. Ele define que determinado valor no vai ser
alterado, e no precisa necessariamente ser aplicado a um valor de fato constante. Pode-se passar uma
varivel para uma funo que recebe uma constante, significando que essa funo no vai alterar esse
valor. Ao passar argumentos por valor, isso nem faz muita diferena, mas no caso de ponteiros sim. Se
uma funo recebe const char*, pode-se passar qualquer ponteiro para caracteres, mesmo no constante.
Nesse caso, const serve para especificar (e enforar) que a funo no vai e nem pode alterar o caracter
apontado pelo ponteiro que ela recebeu.
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 14 de 27
14/11/12 17:02
Em uma declarao, o qualificador const pode ser usado em diversas posies, com diferentes
significados. Pode-se ler da esquerda para direita (em ingls) para compreender as interpretaes. A
construo *const uma construo especial que significa ponteiro constante.
char *const cp;
char const * p;
const char * p2;
const char *const cp2;
chapter3/3.6-01-const.cpp
3.8 Referncias
Uma referncia um nome alternativo para uma varivel. Ela pode ser usada em passagem de
parmetros e retorno de resultados, para fazer com que se opere na varivel original, implementando
passagem por referncia sem usar ponteiros. Nesse sentido ela faz algo bem semelhante a um ponteiro.
Entretanto, uma referncia no um ponteiro, no ocupa espao em memria, e no se podem efetuar
operaes sobre ela (somente sobre a varivel que ela referencia).
chapter3/3.8-01-reference1.cpp
chapter3/3.8-02-reference2.cpp
chapter3/3.8-03-reference3.cpp
Pgina 15 de 27
14/11/12 17:02
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 16 de 27
14/11/12 17:02
Teoria
Pgina 17 de 27
14/11/12 17:02
chapter4/4.1-00-acesso.cpp
chapter4/4.1-01-firstclass.cpp
chapter4/4.1-02-secondclass.cpp
4.3
Construtores e destrutores
Cada classe pode implementar funes construtoras e destrutoras de objetos, que tm,
respectivamente o nome da classe e o nome da classe precedido por ~. As funes construtoras servem
para fazer inicializao do objeto, cuja memria j est alocada, e para criao de sub-objetos, vetores ou
quaisquer outras estruturas que este necessite para estar completo. Se na inicializao de um objeto foram
criados outros objetos por alocao (com os operadores new e new[]), ento na sua destruio estes devem
ser apropriadamente retornados para o sistema (com os operadores delete e delete[]). Esta a finalidade
das funes destrutoras.
chapter4/4.3-01-construtor.cpp
chapter4/4.3-02-conversao.cpp
chapter4/4.3-03-destrutor.cpp
chapter4/4.3-04-destrutor2.cpp
A existncia das funes destrutoras traz um problema tona. Objetos podem ser copiados e
assinalados livremente. Mas quando um objeto contm um ponteiro para algo que ele criou (outro objeto,
vetor, etc...) esse ponteiro ser copiado pelo seu valor binrio, e no o contedo de um sub-objeto para o
outro. No exemplo acima, se dois cursos so criados e voc assinala um ao outro, no somente os dois
ficam com o ponteirointerno apontando para a mesma lista de alunos, como uma das listas de alunos fica
solta sem ningum a referenciando na memria. Quando os objetos sairem do escopo (neste caso, ou
forem deletados com delete), as funes destrutoras iro ser chamadas e iro deletar duas vezes a mesma
lista de alunos, causando mal funcionamento do programa. Para resolver isso, implementa-se uma funo
especial para fazer o assinalamento. Isso possvel atravs da sobrecarga de operadores. Define-se uma
nova funo para o operador de assinalamento =, que dever atuar entre um objeto dessa classe sua
esquerda e um outro objeto da mesma classe sua direita. A funo impplementada faz a cpia correta
dos valores de objetos apontados pelo nosso objeto principal sendo assinalado, e a primeira aplicao
prtica e muito til de sobrecarga de operadores.
chapter4/4.3-05-assignment.cpp
Pgina 18 de 27
14/11/12 17:02
Um ponteiro de uma classe base pode apontar para umobjeto de classe dela derivada, mas no viceversa. Mtodos podem ser redefinidos em classes derivadas, mas o mtodo chamado depende do ponteiro
atrav do qual chamado.
chapter4/4.6-00-derived0.cpp
chapter4/4.6-01-derived1.cpp
4.6.2
Membros protected
Pode-se verificar que quando uma classe deriva de uma outra classe base, mesmo sendo ela um tipo
especializado e sendo tambm do tipo da classe base, ela no tem acesso aos membros provados da classe
base. Para permitir esse acesso, a classe base deve declarar membros protected. Membros protected so
privados desta classe na viso de todo o programa, mas acessveis a classes derivadas.
chapter4/4.6-06-derived6.cpp
4.6.3
Construtores
O construtor de uma classe derivada pode (e deve) chamar construtores de classes base das quais
deriva, passando os parmetros corretos, para que todas os objetos sejam construidos adequadamente.
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 19 de 27
14/11/12 17:02
deriva, passando os parmetros corretos, para que todas os objetos sejam construidos adequadamente.
chapter4/4.6-xx-sample.cpp
4.6.4
Funes virtuais
Embora um ponteiro para uma classe base possa apontar para um objeto de uma classe derivada, ele
no pode chamar os mtodos da classe derivada, mais especializada, pois um ponteiro genrico. Para
isso existem as funes virtuais. Se uma funo qualificada como virtual, quando as classes derivadas
reimplementam essa mesma funo, a verso mais especializada delas que ser chamada, mesmo que o
ponteiro seja somente para a classe base.
chapter4/4.6-03-derived3.cpp
4.6.5
Uma funo virtual pura aquela para a qual nenhuma implementao dada na classe base. Ela
deve ser obrigatoriamente implementada pelas classes derivadas. Isso significa que a classe base com
funes virtuais no pode ser utilzada para criar objetos, pois uma especificao incompleta, a que
chamamos de tipo abstrato, diferindo dos tipos concretos, que so so completos.
chapter4/4.6-04-derived4.cpp
chapter4/4.6-05-derived5.cpp
4.6.6
Herana mltipla
A linguagem C++ permite herana mltipla. Herana mltipla permite flexibilidade mais traz
problemas adicionais, como mltiplas ocorrncias de algum membro comum s classes base. Assim, no
uma opo muito interessante em arquitetura de software. prefervel especificar interfaces abstratas,
que so classes com funes virtuais que apenas especificam que tipos de operaes podem ser
executadas sobre um determinado tipo de objeto, do que realmente implementar herana de mltiplos
tipos concretos.
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 20 de 27
14/11/12 17:02
5.1.2
Pgina 21 de 27
14/11/12 17:02
Pgina 22 de 27
14/11/12 17:02
uma pessoa. Na maioria dos casos, essa resposta bem clara. Em alguns outros, ser possvel identificar
as alternativas. Por exemplo, um boto um objeto grfico, mas ele tambm pode ter uma funcionalidade
prpria e um objeto grfico associado.
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 23 de 27
14/11/12 17:02
6 Templates e STL
Um template uma evoluo das macros de C, mas que inclui todos os recursos sofisticados e
verificaes de alto nvel da linguagem C++. uma maneira de especificar estruturas e algoritmos
configurveis. STL uma biblioteca padronizada contendo um conjunto de templates que implementa as
estruturas de dados e os algoritmos mais utilizados na construo de um programa. Templates devem ser
usados para prover maior produtividade, evitando que se tenha que re-inventar a roda a cada novo
programa, ou que se dependa de bibliotecas produzidas por terceiros e os problemas associados de
portabilidade. Por essa razo, aqui ser tratado apenas o conceito e o praticado o uso de templates da STL,
evitando-se toda complexidade associada definio de novos templates de classes e mtodos. Mesmo
com a excluso desse contedo, apresenta-se brevemente no final o conceito de programao genrica,
cujo potencial bastante atraente.
chapter6/6.1-01-hello.cpp
chapter6/map.cpp
chapter6/hash_map.cpp
chapter6/generic.cpp
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 24 de 27
14/11/12 17:02
Pgina 25 de 27
14/11/12 17:02
---------------------------------------------------------------------<
<=
>
>=
LR inequality relational
---------------------------------------------------------------------==
!=
LR equality relational
---------------------------------------------------------------------&
LR bitwise AND
---------------------------------------------------------------------^
LR bitwise XOR
---------------------------------------------------------------------|
LR bitwise OR
---------------------------------------------------------------------&&
LR logical AND
---------------------------------------------------------------------||
LR logical OR
---------------------------------------------------------------------?:
RL conditional
---------------------------------------------------------------------=
RL assignment
*=
RL multiplication and assignment
/=
RL division and assignment
%=
RL modulus (remainder) and assignment
+=
RL addition and assignment
-=
RL subtraction and assignment
---------------------------------------------------------------------throw
LR throw exception
---------------------------------------------------------------------,
LP the operator, not the separator
(combines two expressions into one)
----------------------------------------------------------------------
As palavras reservadas da linguagem C++ so as da tabela abaixo. Elas no podem ser utilizadas
como nomes de identificadores, e isso pode conflitar com programas escritos em C e que sejam portados
para C++.
asm
auto
break
case
catch
char
class
const
continue
default
delete
http://www.inf.ufrgs.br/~johann/cpp2004/
do
double
else
enum
explicit
extern
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
operator
private
protected
public
register
return
short
signed
sizeof
static
struct
switch
template
this
throw
try
typedef
union
unsigned
using
virtual
void
volatile
while
Pgina 26 de 27
14/11/12 17:02
Bibliografia
[STR 97]
[STR 2004]
[HAM 98]
Scott Hamilton. The father of C++ explains why Standard C++ isn't just an objectoriented
language.
New
York,
IEEE,
1998.
Disponvel
em:
http://www.research.att.com/~bs/ieee_interview.html.
[STE 91]
[SGI 2004]
[BRA 1998]
Eric Brasseur
. C++ tutorial for C users. 1998. Disponvel em:
http://www.4p8.com/eric.brasseur/cppcen.html#l24
[CPP
2004]
operators.
Disponvel
em
[SCO 2004] Porter Scobey. C++ Operators, with Precedence and Associativity 2004 Disponvel em :
http://www.cs.stmarys.ca/~porter/csc/ref/cpp_operators.html.
[ECK 2000]
http://www.inf.ufrgs.br/~johann/cpp2004/
Pgina 27 de 27