Escolar Documentos
Profissional Documentos
Cultura Documentos
por
monitoria
Sumrio
Resumo 1 2 2.1 2.2 2.3 2.4 2.5 4 5 6 Introduo
Compilando o primeiro programa: Hello World ................................................... 6 Declarao de variveis e tipos de dados .............................................................. 7 Operadores, expresses e precedncia...................................................................8 Usando alguns vetores ........................................................................................... 8 Construes de controle de fluxo ..........................................................................8 8 9 9 9 10
2.5.8 C++ tem label e goto, mas no contem para ningum 2.6
11
13
3.3
Estruturas .............................................................................................................14
3.3.1 struct 14 3.3.2 union 14 3.3.3 enum 14 3.4 3.5 3.6 3.7 3.8 3.9 3.10 4 4.1 typedef ................................................................................................................. 14 Ponteiros .............................................................................................................. 15 Constantes............................................................................................................16 Os quatro tipos de cast ......................................................................................... 16 Referncias ..........................................................................................................17 Ponteiros para estruturas ...................................................................................... 17 Alocao de Memria .......................................................................................... 17 Recursos para Programao Orientada a Objetos 18
4.1.1 Teoria 18 4.2 4.3 4.4 4.5 4.6 Controle de Acesso .............................................................................................. 18 Construtores e destrutores ................................................................................... 19 Sobrecarga de operadores .................................................................................... 20 Membros estticos e constantes ...........................................................................20 Herana de classes ............................................................................................... 20 21
4.6.1 Classes base e derivada 4.6.2 Membros protected 4.6.3 Construtores 21 4.6.4 Funes virtuais 21 21
21
5 5.1
Programao em mdulos ................................................................................... 24 Listas encadeadas por herana e com ponteiros .................................................. 24 Relaes do tipo um e tem um ...................................................................25 Templates e STL 26
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 extra-classe 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++
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 ligar-se 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.
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
2.5.1
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: 1Escreva 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 A
2-
de 7,5 a 9 de 6 a 7,5 de 0 a 6
B C D
3-
Escreva um programa que l 3 valores na linha de comando e imprime a mdia, dizendo "Parabns!!!" se a media for superior a um limiar prdefido, ou "Que pena..." se for inferior.
2.5.2
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; A execuo do for corresponde seguinte seqncia: expr1; expr2; {comando; expr3; expr2; } {comando; expr3; expr2;} ... Em expr1 e expr3 pode-se escrever qualquer cdigo de inicializao e de preparao para a prxima repetio, atuando sobre quaisquer variveis. Essas expresses podem conter vrios assinalamentos separados por vrgulas. A expresso expr2 controla o lao, e tambm pode conter cdigo arbitrrio. Ela executada antes da primeira repetio, de modo que o comando no executado nenhuma vez se a expresso expr2 falsa inicialmente. Exerccios: 1Escreva um programa que l um conjunto de 10 valoes inteiros e verifica se algum deles negativo. Escreva um programa que l um conjunto de 10 nmeros na linha de comando e imprime o nmero de pares e mpares
2-
2.5.4
As construes while e do
A construo while (expr) comando; idntica a um for (;expr;) comando;. J a construo do comando; while (expr) difere das anteriores no sentido de que executa pelo menos uma vez o comando, mesmo quando a expresso expr inicialmente falsa. Exerccios: 1Escreva um programa que fique indefinidamente lendo valores de entrada do usurio, dizendo se o valor par ou mpar, at que este digite um nmero especial de sada, como 99, por exemplo. Escreva o programa que l 3 valores na linha de comando e imprime a mdia de forma que, aps realizar o primeiro clculo de mdia, ele pergunte ao usurio se ele deseja fazer outro.
2-
2.5.5
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: 1Escreva 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". Escreva um programa para dar o conceito de alunos em funo da nota, conforme a mesma tabela de exerccio anterior, mas que consulte trs vetores de nmeros inteiros, cada um com 10 posies, correspondendo aos 10 alunos. O primeiro vetor tem 0 se o aluno desistiu e cancelou o curso, e voc no deve simplesmente ignor-lo, ou 1 em caso contrrio. O segundo vetor tem o nmero de aulas assistidas, e se for menor do que 3 (de 5 aulas) o aluno receber conceito FF (falta de freqncia). Finalmente o terceito vetor contm a nota do aluno, para classificao segundo os outros conceitos.
2-
2.5.6
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: 1Escreva 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
2.5.7
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; // a recebe 10 se b maior que 10 ou b caso contrrio
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.
2.6.1
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 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
classes e templates da STL, introduzidas posteriormente, mas completam at aqui um conjunto de recursos completo para programao estruturada.
3.1 Vetores
J foi vista a declarao e uso de vetores simples. Se um vetor tem inicializao, podese 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 cdigofonte 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.
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 significa valor apontado por, e chamado operador de de-referenciao. Um ponteiro apenas uma varivel cujo contedo um endereo de memria, provavelmente o endereo de outra varivel. Esse endereo pode ser obtido por referenciao, e posteriormente o dado daquela varivel apontada pode ser manipulado por de-referenciao. Para declarar um ponteiro, acrescenta-se * entre o tipo e o nome da varivel (nesse caso varivel apontador). Convm j notar que uma varivel do tipo ponteiro, ou apontador, como todas as outras, tambm tem seu contedo (que vai ser o endereo de outra) e seu prprio endereo em memria. por isso que aparecem os ponteiros para ponteiros.
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. 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; // ponteiro constante para um caracter // ponteiro para um caracter constante // outro ponteiro para um caracter constante // ponteiro constante para um caracter constante
chapter3/3.6-01-const.cpp
const_cast<T> e Elimina o qualificador const de uma expresso e, produzindo um valor do tipo T em lugar de const T; dynamic_cast<T> e uma converso de ponteiros inteligente, onde os tipos de dado de origem e destino so identificados em tempo de execuo para verificar se um ponteiro do tipo T pode ser utilizado para apontar para e;
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
4.1.1
Teoria
Na teoria do paradigma de orientao a objetos (O-O), o programa formado por um conjunto de classes que so modelos para criao de objetos. As classes e objetos possuem membros que so dados privados, e mtodos de acesso, que so as funes. Quando um trecho de cdigo quer fazer uma operao sobre um objeto ele emite uma mensagem para esse objeto requisitando a operao. Na prtica, pode-se implementar isso como uma simples chamada de funo (chamada de mtodo), que o que ocorre em C++. A principal caracterstica de O-O o encapsulamento, que justamente o fato de os dados no estarem acessveis diretamente, mas apenas atravs dos mtodos permitidos. Para completar o conceito de O-O, o mecanismo de herana faz a definio de classes mais especializadas a partir de classes bsicas. Nesse caso, se pode reimplementar mtodos de uma classe bsica na classe mais especializada e posteriormente tratar diversos objetos diferentemente especializados atravs dos mesmos mtodos, o que chama-se de polimorfismo. A especificao de classes cuja nica funo definir conjuntos de mtodos d origem ao conceito de classes abstratas e as diferencia dos tipos concretos que so aqueles que realmente implementam os mtodos.
O controle de acesso um recurso que proteje os dados, apenas em tempo de compilao, para enforar a idia de encapsulamento. Uma boa regra sempre declarar todas as variveis em uma classe como privadas, e oferecer mtodos para inspecionar e alteras aquelas que devem ser permitidas. natural que muitas classes ento tenham dados privados, um conjunto de funes get para retornar cada dado, e um conjunto de funes set para setar cada dado. Sempre faa assim, mesmo que paraa intil primeira vista. Desta forma garantido que: 1- somente os dados para os quais voc oferece mtodos sero acessados diretamente; 2- todo acesso feito atravs desses mtodos, e portanto possvel deix-los consistentes um a um e entre eles; 3- qualquer alterao de formato, representao, origem nos dados poder ser feita em apenas um lugar. chapter4/4.1-00-acesso.cpp chapter4/4.1-01-firstclass.cpp chapter4/4.1-02-secondclass.cpp
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
derivada. A herana pode ser pblica ou privada. Quando privada, default, as caractersticas pblicas da classe base se tornam privadas na classe derivada.
4.6.1
Um ponteiro de uma classe base pode apontar para umobjeto de classe dela derivada, mas no vice-versa. 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. 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.
5.1.1
sempre inicialize as variveis na sua declarao; sempre teste a validade dos parmetros recebidos em uma funo: se forem nmeros, seus limites, e se for ponteiro, para que no seja nulo; declare todas as variveis de objeto como privadas, sem excees; jamais utilize nmeros no cdigo: declare constantes que digam seu significado e sejam inicializadas com seu valor; sempre desconfie quando voc escrever trs vezes o mesmo cdigo: deve haver um meio genrico de fazer o mesmo com repeties, vetores, indireo ou templates; no use variveis globais, variveis estticas, goto, defines;
prefira construes simples e claras aglomerados de expresses que fazem o mesmo processamento; use o qualificador const sempre que possvel; evite o uso de ponteiros: use referncias e as estruturas de STL, guardando objetos em vetores, listas e principalmente maps, onde eles podem ser localizados, recuperados e alterados atravs do uso de identificadores e iteradores;
5.1.2
sempre use edentao correta, preferencialmente com as chaves alinhadas; comente no inicio do arquivo o que ele faz, seu autor, data de criao, e ao menos data da ltima atualizao e qual foi: se possvel, mantenha a lista das atualizaes, datas e quem as executou; use comentrios antes das implementaes das funes dizendo o que elas fazem, a estratgia, o algorimo; use comentrios separando partes do cdigo e anunciando o que ser feito; use comentrios no fim da linha para explicar detalhes daquela linha; declare apenas uma varivel por linha; use nomes de variveis que expliquem seu uso; faa tabulaes na declarao de variveis (em classes e mtodos) de forma que fiquem alinhados verticalmente: tipos de retorno, nomes, parmetros, comentrios;
chapter5/5.2-00-main1.c De forma anloga, um programa em C++ tambm composto por um conjunto de definies e depois as suas implementaes. As definies devem ir para um arquivo de cabealho (.h) e as implementaes para arquivo do mdulo (.cpp). chapter5/5.2-01-program1.cpp chapter5/5.2-01-module1.h chapter5/5.2-01-module1.cpp chapter5/5.2-01-main1.cpp
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
Anexo 1 Operadores e palavras reservadas essencial para a programao conhecer os operadores da linguagem C++. Listas de operadores, descries e exemplos podem ser encontrados em muitas fontes, como em http://www.cplusplus.com/doc/tutorial/tut4-2.html [CPP 2004], por exemplo. A seguir est uma lista de todos os operadores da linguagem , com sua associatividade e finalidade, retirada de http://www.cs.stmarys.ca/~porter/csc/ref/cpp_operators.html [SCO 2004]. A tabela inicia com os operadores de mais alta precedncia, e cada nvel de menos precedncia est separado pelas linhas pontilhadas. A precedncia define qual operao ser efetuada primeiro quando aparece ao lado de outras com operadores de mesma precedncia. J a associatividade diz qual operao ser edetuada primeiro quando os operadores tm mesmo nvel de precedncia. A associatividade pode ser esquerda (LR) ou direita (RL).
Operators Assoc Description
---------------------------------------------------------------------(expression) :: :: RL LR parentheses used for grouping (unary) global scope resolution operator class scope resolution operator
---------------------------------------------------------------------() () . -> LR LR LR LR parentheses used for a function call value construction, as in type(expression) member selection via struct or class object member selection via pointer
LR LR LR LR LR LR LR
array element access specialized type cast specialized type cast specialized type cast specialized type cast type identification postfix versions of increment/decrement
---------------------------------------------------------------------All the operators in this section are unary (one argument) operators. ++ + ! ~ & * new delete object new [] delete [] sizeof (type) -RL RL RL RL RL RL RL RL prefix versions of increment/decrement
unary versions logical NOT bitwise complement ("ones complement") address of dereference allocates memory to dynamic object de-allocates memory allocated to dynamic
RL RL RL RL
allocates memory to dynamic array de-allocates memory allocated to dynamic array for computing storage size of data cast (C-style type conversion)
LR
---------------------------------------------------------------------| LR bitwise OR
---------------------------------------------------------------------|| LR logical OR
---------------------------------------------------------------------?: RL conditional
---------------------------------------------------------------------= *= /= %= += -= RL RL RL RL RL RL assignment multiplication and assignment division and assignment modulus (remainder) and assignment addition and assignment 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 do auto double break else case enum catch explicit char extern class float const for continue friend default goto delete
public register return short signed sizeof static struct switch template
this throw try typedef union unsigned using virtual void volatile while
Bibliografia [STR 97] Stroustrup, Bjarne. The C++ Programming Language Third edition. Addison-Wesley, 1997. Stroustrup, Bjarne. The C++ Programming Language. 2004. Disponvel em: http://www.research.att.com/~bs/C++.html Scott Hamilton. The father of C++ explains why Standard C++ isn't just an object-oriented language. New York, IEEE, 1998. Disponvel em: http://www.research.att.com/~bs/ieee_interview.html. Al Stevens. Aprenda voc mesmo C++. Rio de Janeiro, LTC, 1991. SGI. Standard Template Library Programmer's Guide. 2004. Disponvel em: http://www.sgi.com/tech/stl/
[STR 2004]
[HAM 98]
[BRA 1998] Eric Brasseur . C++ tutorial for C users. 1998. Disponvel em: http://www.4p8.com/eric.brasseur/cppcen.html#l24
[CPP 2004]
Cplusplus Recources. Overloading operators. Disponvel em : http://www.cplusplus.com/doc/tutorial/tut4-2.html. Porter Scobey. C++ Operators, with Precedence and Associativity 2004 Disponvel em : http://www.cs.stmarys.ca/~porter/csc/ref/cpp_operators.html.
[SCO 2004]
[ECK 2000] Bruce Eckel. Thinking in C++ 2nd Edition. 2004 Disponvel em : http://mindview.net/Books/TICPP/ThinkingInCPP2e.html. (Free Electronic Book)