Transcription of LINGUAGEM - IME-USP
1 LINGUAGEM Silvio do lago Pereira LINGUAGEM C++ Copyright 1999 by Silvio do Lago Pereira Todos os direitos reservados. permitida a reprodu o total ou parcial deste texto, sem o pagamento de direitos autorais, desde que as c pias sejam feitas e distribu das sem fins lucrativos e com a autoriza o do autor. Advert ncia O autor acredita que todas as informa es aqui apresentadas est o corretas e podem ser utilizadas para qualquer fim legal. Entretanto, n o existe qualquer garantia, seja expl cita ou impl cita, de que o uso de tais informa es conduzir sempre ao resultado desejado. Pereira, Silvio do Lago LINGUAGEM C++ / Silvio do Lago Pereira. S o Paulo: FATEC, 1999. 1. L gica de programa o 2. Programa o orientada a objetos 3. C++ ( LINGUAGEM de programa o para computadores) I. T tulo Sum rio i Sum rio 1. Um C Coment Entrada e sa Manipuladores .. Convers es expl Defini o de vari Constantes.
2 Tipos compostos .. Refer Aloca o de mem ria .. 2. Fun Prot Passagem por refer Par metros com valores Fun es Sobrecarga de fun 3. Defini o de uma Encapsulamento .. Defini o de fun es membros .. Instancia o de uma classe .. Fun es membros Construtores e destrutores .. Construtor de c Lista de inicializa o de um O ponteiro Membros est ticos .. Classes e fun es 4. Sobrecarregando operadores .. Sobrecarga por uma fun o Sobrecarga por uma fun o amiga .. Operador de atribui Sobrecarga de ++ e -- .. Operadores de convers Sum rio ii5. Padr Padr es de fun Padr es de fun es versus Classes Instancia o de classes parametrizadas .. 6. Heran Heran a simples .. Modos de deriva Redefini o de m todos numa classe derivada .. Declara o de Heran a, construtores e destrutores .. Convers o de tipo numa hierarquia de Heran a m Heran a Polimorfismo e fun es virtuais.
3 Classes 7. Generalidades .. Fluxos e O fluxo de sa da padr o .. O fluxo de entrada padr Controle de estado de um fluxo .. Associando um fluxo a um Formata o de dados .. Os Criando manipuladores .. 8. Exce A estrutura Discriminando exce Hierarquia de exce es .. Declara o das exce es lan adas por uma fun Um C melhorado 1 1. Um C melhorado Esse cap tulo apresenta os novos recursos oferecidos pela LINGUAGEM C++, sem no entanto explorar as caracter sticas de orienta o a objetos, que ser o vistas brevemente. Coment rios A LINGUAGEM C++ introduz uma nova forma de coment rios. Al m dos s mbolos /* e */, oferecidos em C, podemos agora empregar tamb m o s mbolo //, a partir do qual todo o texto at o final da linha ignorado. Exemplo : /* o coment rio tradicional, englobando v rias linhas, v lido tanto em C quanto em C++ */ // j o coment rio de uma nica linha v lido apenas em C++ prefer vel utilizar coment rios no estilo C++ em vez daqueles no estilo C, que podem isolar importantes blocos de instru es.
4 Entrada e sa da A entrada e sa da de dados em C feita atrav s das fun es scanf() e printf(), dispo-n veis na sua biblioteca padr o. Apesar destas fun es ainda estarem dispon veis em C++, vamos preferir utilizar o novo sistema de entrada e sa da de dados por fluxo. Uma vez inclu do o arquivo , um programa C++ disp e de tr s fluxos pre-definidos que s o abertos automaticamente pelo sistema: cin, que corresponde entrada padr o cout, que corresponde sa da padr o cerr, que corresponde sa da padr o de erros O operador << permite inserir valores em um fluxo de sa da, enquanto o operador >> permite extrair valores de um fluxo de entrada. Exemplo : #include < > void main(void) { cout << Ol mundo!\n ; } Um C melhorado 2 O operador << pode ser usado, de forma encadeada, para inserir diversos valores em um mesmo fluxo de sa da. Exemplo : #include < > void main(void) { char nome[80]; cout << Qual o seu nome? ; cin >> nome; cout << Ol << nome << , tudo bem?}
5 \n ; } O operador >> tamb m pode ser usado de forma encadeada. Exemplo : #include < > void main(void) { float comprimento, largura; cout << "Informe o comprimento e a largura do ret ngulo: "; cin >> comprimento >> largura; cout << " rea do ret ngulo: " << comprimento * largura << " m2\n ; } Note a aus ncia do operador de endere o (&) na sintaxe do fluxo cin. Ao contr rio da fun o scanf(), n o precisamos usar o operador de endere o com o fluxo cin. Vantagens dos fluxos de entrada e sa da: execu o mais r pida: a fun o printf() analisa a cadeia de formata o durante a execu o do programa, enquanto os fluxos s o traduzidos durante a compila o; verifica o de tipos: como a tradu o feita em tempo de compila o, valores inesperados, devido a erros de convers o, jamais s o exibidos; c digo mais compacto: apenas o c digo necess rio gerado; com printf(), por m, o compilador deve gerar o c digo correspondente a todos os formatos de impress o; uniformidade sint tica: os fluxos tamb m podem ser utilizados com tipos definidos pelo usu rio (atrav s da sobrecarga dos operadores >> e <<).
6 Exemplo : #include < > #include < > void main(void) { int i = 1234; double d = ; printf( \ni = %i, d = %d , i, d); // erro de convers o! cout << "\ni = " << i << ", d = << d; } Um C melhorado 3 Observe a seguir como a fun o printf() exibe um valor inesperado para a vari vel d. Isso ocorre porque foi usado um formato de exibi o errado (o correto seria %lf ), que n o pode ser verificado em tempo de execu o. i = 1234, d = -1202590843 i = 1234, d = Manipuladores Os manipuladores s o elementos que determinam o formato em que os dados ser o escritos ou lidos de um fluxo. Os principais manipuladores s o: oct leitura e escrita de um inteiro octal dec leitura e escrita de um inteiro decimal hex leitura e escrita de um inteiro hexadecimal endl insere um caracter de mudan a de linha setw(int n) define campo com largura de n caracteres setprecision(int n) define total de d gitos na impress o de n meros reais setfill(char c) define o caracter usado no preenchimento de campos flush descarrega o buffer ap s a escrita Exemplo : #include < > #include < > void main(void) { int i=1234; float p= ; cout << "|" << setw(8) << setfill('*') << hex << i << "|\n" << "|" << setw(6) << setprecision(4) << p << "|" << endl; } Resultado da execu o: |**4d2| |* | Um C melhorado 4 Convers es expl citas Em C++, a convers o expl cita de tipos pode ser feita tanto atrav s da nota o de cast quanto da nota o funcional.
7 Exemplo : int i, j; double d = ; i = (int)d; // nota o cast j = int(d); // nota o funcional Entretanto, a nota o funcional s pode ser usada com tipos simples ou definidos pelo usu rio. Para utiliz -la com ponteiros e vetores, precisamos antes criar novos tipos. Exemplo : typedef int * ptr; int *i; double d; i = ptr( // nota o funcional com ponteiro Defini o de vari veis Em C++ uma vari vel pode ser declarada em qualquer parte do c digo, sendo que seu escopo inicia-se no ponto em que foi declarada e vai at o final do bloco que a cont m. Exemplo : #include < > void main(void) { cout << Digite os valores (negativo finaliza): ; float soma = 0; while( true ) { float valor; cin >> valor; if( valor<0 ) break; soma += valor; } cout << \nSoma: << soma << endl; } Podemos at declarar um contador diretamente dentro de uma instru o for : Exemplo : #include < > void main(void) { cout << Contagem regressiva: << endl; for(int i=9; i>=0; i--) cout << i << endl; } Um C melhorado 5 O operador de resolu o de escopo (::) nos permite acessar uma vari vel global, mesmo que exista uma vari vel local com o mesmo nome.)
8 Exemplo : #include < > int n=10; void main(void) { int n=20; { int n=30; ::n++; // altera vari vel global cout << ::n << << n << endl; } cout << ::n << << n << endl; } A sa da produzida por esse programa a seguinte: 11 30 11 20 Constantes Programadores em C est o habituados a empregar a diretiva #define do preproces-sador para definir constantes. Entretanto, a experi ncia tem mostrado que o uso dessa diretiva uma fonte de erros dif ceis de se detectar. Em C++, a utiliza o do preprocessador deve ser limitada apenas aos seguintes casos: inclus o de arquivos; compila o condicional. Para definir constantes, em C++, usamos a palavra reservada const. Um objeto assim especificado n o poder ser modificado durante toda a sua exist ncia e, portanto, imprescind vel inicializar uma constante no momento da sua declara o. Exemplo : const float pi = ; const int meses = 12; const char *msg = pressione ; poss vel usar a palavra const tamb m na defini o de ponteiros.
9 Nesse caso, deve estar bem claro o que ser constante: o objeto que aponta ou aquele que apontado. Exemplo : const char * ptr1 = um ; // o objeto apontado constante char * const ptr2 = dois ; // o objeto que aponta constante const char * const ptr3 = tr s ; // ambos s o constantes Um C melhorado 6 Tipos compostos Assim como em C, em C++ podemos definir novos tipos de dados usando as palavras reservadas struct, enum e union. Mas, ao contr rio do que ocorre na LINGUAGEM C, a utiliza o de typedef n o mais necess ria para renomear o tipo. Exemplo : struct Ficha { char *nome; char *fone; }; Ficha f, *pf; Em C++, cada enumera o enum um tipo particular, diferente de int, e s pode arma-zenar aqueles valores enumerados na sua defini o. Exemplo : enum Logico { falso, verdade }; Logico ok; ok = falso; ok = 0; // erro em C++, ok n o do tipo int ok = Logico(0); // convers o expl cita permitida Refer ncias Al m de ponteiros, a LINGUAGEM C++ oferece tamb m as vari veis de refer ncia.
10 Esse novo recurso permite criar uma vari vel como sendo um sin nimo de uma outra. Assim, modificando-se uma delas a outra ser tamb m, automaticamente, atualizada. Exemplo : #include < > void main(void) { int n=5; int // nr uma refer ncia a n int *ptr = // ptr aponta nr (e n tamb m!) cout << n = << n << nr = << nr << endl; n += 2; cout << n = << n << nr = << nr << endl; *ptr = 3; cout << n = << n << nr = << nr << endl; } A sa da produzida por esse programa a seguinte: n = 5 nr = 5 n = 7 nr = 7 n = 3 nr = 3 Uma vari vel de refer ncia deve ser obrigatoriamente inicializada e o tipo do objeto referenciado deve ser o mesmo do objeto que referencia. Um C melhorado 7 Aloca o de mem ria C++ oferece dois novos operadores, new e delete, em substitui o respectivamente s fun es malloc() e free(), embora estas fun es continuem dispon veis. O operador new aloca um espa o de mem ria, inicializa-o e retorna seu endere o.