Você está na página 1de 6

Professora Isabel Harb Manssour Linguagem de Programao C++

2. ELEMENTOS DE C++
Na seo anterior foi apresentado um exemplo simples de um programa em C++ para mostrar alguns dos seus principais elementos. Nesta seo a estruturao de um programa em C++ ser mais detalhada. Tambm sero apresentados exemplos de programas simples que trabalham com herana e polimorfismo de funo. A partir de agora, ento, alguns dos principais elementos de C++ so destacados. Comentrios e Arquivos Fonte: Descritos na seo anterior. Arquivos Header e Diretivas #include: Cada implementao de C++ vem com uma biblioteca de funes predefinidas, operadores e outras entidades. Programadores so estimulados a usar estas entidades prdefinidas, mas precisam primeiro declar-las em cada arquivo fonte no qual so utilizadas. Para evitar que os programadores tenham que memorizar as declaraes necessrias e escrev-las repetidamente, so fornecidos vrios arquivos header, cada um contendo as declaraes para uma certa parte da biblioteca. Um arquivo header inserido em um programa atravs da diretiva #include, a qual o pr-processador troca pelo contedo do arquivo header. No exemplo anterior, o programa "Hello, World!" usa as facilidades da biblioteca para o fluxo de sada, onde as declaraes necessrias esto contidas no arquivo header iostream.h, que o programa inclui com a diretiva #include <iostream>. Funes e a main(): Os blocos bsicos de construo dos programas C++ so funes, que correspondem a funes, procedimentos e subrotinas em outras linguagens. Cada funo implementa um conjunto de procedimentos logicamente relacionados para execuo de uma operao bem definida. Uma funo chamada ou invocada sempre que a operao necessria. Funes podem ser definidas no programa ou podem ser funes pr-definidas da biblioteca. Quando as funes de um biblioteca so utilizadas, os arquivos header contendo as declaraes necessrias devem ser includos. As funes recebem uma lista de parmetros, que pode ser vazia. Neste caso, parnteses so associados com funes e sempre aparecem nas declaraes, definies e chamadas de funes. Quando um nome de funo aparece no cdigo, conveno do C e do C++ que um par de parnteses seja colocado aps o nome da funo para indicar que o nome diz respeito a uma funo. Se no tiver nada entre os parnteses significa que a funo no possui argumentos. Funes tambm retornam apenas um ou nenhum valor (quando o retorno do tipo void). Como j comentado, quando um programa executado a primeira funo que ele chama a main(). Input/Output: No C++, a entrada lida de, e a sada escrita em streams, sendo que o tipo da varivel determina o tipo de valor de entrada e/ou sada. Quando iostream.h includa em um programa, vrios streams padro so definidos automaticamente. O stream "cin" usado para entrada, que normalmente consiste em uma leitura do teclado. O stream "cout" usado para sada, que normalmente enviada para o monitor. O operador de insero "<<" insere dados em um stream, e o operador de extrao ">>" retira dados de um stream e armazena-os em variveis. Quando um string (srie de caracteres que aparecem entre aspas) inserido em cout, o seu contedo imprimido. Se cin no for explicitamente redirecionado, a entrada ser feita atravs do teclado. C++ usa seqncias escape para representar caracteres que no so representados por smbolos tradicionais como a, b e c. Uma seqncia escape consiste no caracter \ seguido de uma letra ou nmero. Como j comentado anteriormente, toda seqncia escape representa um nico caracter. Algumas seqncias comuns so: \n (nova linha), \a (alerta), \t (tab) e \" (insere aspas em um string). Identificadores: Um identificador consiste em um conjunto de letras, dgitos ou _, sendo que o primeiro caracter deve, obrigatoriamente, ser uma letra (incluindo _). Um identificador no pode ser igual a uma palavra reservada. C++ diferencia letras maisculas de minsculas, portanto "nome", "Nome" e "NOME" so trs identificadores diferentes. Deve-se evitar a criao de identificadores que comecem ou terminem com _,

Professora Isabel Harb Manssour Linguagem de Programao C++

a menos que eles j sejam definidos pela implementao de C++, pois este usa tais identificadores para evitar conflitos com identificadores criados pelo programador. Valores, Tipos e Constantes: Como a maioria das outras linguagens de programao, C++ classifica valores de dados em tipos, de acordo como eles so armazenados na memria e quais operaes podem ser executadas por eles. Tipos cujos valores representam nmeros podem ser chamados de tipos aritmticos, que so divididos em tipos inteiros (char, short, int, long, que podem ser signed ou unsigned) e tipos de ponto flutuante (float, double, long double) [3]. Tipos booleanos (bool) podem receber apenas true ou false. Constantes, que so usadas para fazer com que no se altere o valor de uma varivel, podem ser inteiras, escritas como em aritmtica ordinria, ou caracteres, representados pelos seus cdigos numricos. Neste caso, o modificador const usado para atribuir um valor inicial para uma varivel que no poder ser alterado pelo programa. Qualquer atribuio futura para varivel do tipo const resultar em erro de compilao. O C++ tambm estende o uso de const para incluir classes e funes membros. Na definio de uma classe em C++, utiliza-se const seguido da declarao de uma funo membro, que impedida de modificar qualquer dado na classe. Variveis enumeradas: O tipo enum foi elaborado para que o programador possa tornar mais legvel seu cdigo. Com ele, por exemplo, pode-se escrever laos de uma forma mais prxima de como o problema abstrado. Na declarao de tipo enumerado coloca-se o nome do tipo, os valores que uma varivel deste tipo receber e os valores com que o programa tratar essas variveis. Em outras palavras, enumeraes permitem definir tipos inteiros cujos valores so representados por identificadores. Por exemplo [3, 9]:
enum dia_semana { domingo = 1, segunda, tera, quarta, quinta, sexta, sabado }; // tratar como 1 // tratar como 2 // tratar como 3 // tratar como 4 // tratar como 5 // tratar como 6 // tratar como 7

Em C++ o nome da enumerao tratado como um tipo conhecido a partir da sua definio. Assim, para declarar-se variveis deste tipo deve-se usar seu rtulo especfico, como por exemplo:
dia_semana dia;

Definio e declarao de estruturas: A definio de variveis estruturadas em C/C++ obtida atravs do uso da palavra reservada struct, seguida de um rtulo especificando o nome da estrutura.
struct Funcionario { char nome [50]; char endereco [80]; float salario; };

Uma vez definida a estrutura, pode-se definir variveis para ela. Por exemplo,
Funcionario empresa [40]; // 40 funcionrios em uma empresa

um vetor, onde em cada posio guardado um nome, endereo e telefone. Para acessar um membro de uma varivel estruturada, deve-se usar o nome da varivel, um ponto e o nome do membro. Seguindo o exemplo anterior, o acesso aos membros feito da seguinte maneira:
strcpy (empresa [3].nome, "Joao Alfredo"); strcpy (empresa [3].endereco, "Rua A, numero 10"); empresa [3].salario = 530.00;

importante ressaltar que o total de espao ocupado por uma estrutura equivalente soma em bytes dos tipos que a compem [9]. Classes e Objetos: Na programao orientada a objetos, um programa executando em um computador feito de componentes que interagem, chamados objetos. Conforme o programa executado, os objetos interagem enviando mensagens uns para os outros e recebendo respostas. Como j comentado anteriormente, uma classe contm uma descrio completa de um tipo de objeto, e um objeto uma instncia de uma classe. Em C++ as classes so tipos de dados definidos pelo usurio, e so utilizadas da

Professora Isabel Harb Manssour Linguagem de Programao C++

mesma maneira que um tipo int ou double. As instncias da classes em C++ so aqueles objetos (variveis) que so declarados com a classe assim como seus tipos de dados. Uma classe declarada usando a palavra reservada class. A menos que seja especificado o contrrio, em C++, todos os membros, por default, so considerados private[3]. Uma classe possui um nome que colocado aps a palavra reservada class, isto , uma palavra reservada no interior do escopo da classe. Uma classe em C++ delimitada por "{" e "};". Classes podem conter uma lista de membros, que pode declarar dados, funes, classes, enumeraes, campos de bits, friends (funo que no um membro da classe, mas tem permisso para usar os nomes de membros privados e protegidos da classe), e nomes de tipos. Os membros de uma classe podem ser declarados como private, public ou protected. Uma funo membro declarada da seguinte maneira: <tipo> <nome_da_classe>::<nome_da_funo> (<parmetros>), onde tipo identifica, por exemplo, se funo retorna um valor inteiro, float ou no retorna nada (void). Torna-se importante comentar que classes podem ser declaradas com struct ou union. Neste caso seus membros e classes bsicas so pblicos por default [2, 3]. Herana: A herana permite que uma nova classe seja definida atravs da extenso ou modificao de uma ou mais classes existentes. A nova classe chamada de subclasse e a classe existente chamada de superclasse. Uma subclasse pode servir como superclasse, e assim por diante, permitindo a criao de uma hierarquia de classes relacionadas atravs da herana. Fala-se em herana simples quando uma subclasse tem apenas uma superclasse, e herana mltipla quando uma subclasse possui vrias superclasses. A herana mltipla permite combinar as propriedades das classes existentes. A sintaxe para declarao de uma subclasse : class <nome_classe_derivada> : <especif_acesso> <nome_classe_base>, onde <especif_acesso> pode ser private, public ou protected. Torna-se importante atentar para o fato de que pode haver vrias <especif_acesso> <nome_classe_base>, no caso de herana mltipla [3]. A seguir apresentado um programa em C++ que exemplifica a utilizao de herana [10].
#include <iostream> using namespace std; enum tipo {carro, van, perua};

class Veiculo_Estrada { int rodas; int passageiros; public: void define_rodas(int num); int pega_rodas(); void define_passa(int num); int pega_passa(); }; class Caminhao : public Veiculo_Estrada { int carga; public: void define_carga(int tamanho); int pega_carga(); void mostrar(); }; class Automovel : public Veiculo_Estrada { enum tipo carro_tipo; public: void define_tipo(enum tipo t); enum tipo pega_tipo(); void mostrar(); };

// Funes da superclasse ("Veiculo_Estrada") void Veiculo_Estrada::define_rodas(int num) { rodas = num; }

Professora Isabel Harb Manssour Linguagem de Programao C++


int Veiculo_Estrada::pega_rodas() { return rodas; } void Veiculo_Estrada::define_passa(int num) { passageiros = num; } int Veiculo_Estrada::pega_passa() { return passageiros; }

// Funes da classe "Caminhao" void Caminhao::define_carga(int num) { carga = num; } int Caminhao::pega_carga() { return carga; } void Caminhao::mostrar() { cout << "Rodas: " << pega_rodas() << "\n"; cout << "Passageiros: " << pega_passa() << "\n"; cout << "Capacidade da carga em metros cubicos: " << carga << "\n \n"; }

// Funes da classe "Automovel" void Automovel::define_tipo(enum tipo t) { carro_tipo = t; } enum tipo Automovel::pega_tipo() { return carro_tipo; } void Automovel::mostrar() { cout << "Rodas: " << pega_rodas() << "\n"; cout << "Passageiros: " << pega_passa() << "\n"; cout << "Tipo: "; switch(pega_tipo()) { case van: cout << "Van\n \n"; break; case carro: cout << "Carro\n \n"; break; case perua: cout << "Perua\n \n"; } } // Funo Principal main() { Caminhao t1, t2; Automovel c; t1.define_rodas(18); t1.define_passa(2); t1.define_carga(3200); t2.define_rodas(6); t2.define_passa(3); t2.define_carga(1200); t1.mostrar(); t2.mostrar(); c.define_rodas(4); c.define_passa(6); c.define_tipo(van); c.mostrar(); }

Obs.: O tipo void especifica um conjunto vazio de valores; ele usado como o tipo de retorno para funes que no retornam um valor. Polimorfismo: Literalmente, polimorfismo significa a habilidade de ter muitas formas, ou seja, na programao orientada a objetos caracterizado pela expresso "uma interface, diversos mtodos". O

Professora Isabel Harb Manssour Linguagem de Programao C++

polimorfismo ocorre quando os objetos com estruturas internas muito diferentes podem compartilhar a mesma interface externa e podem ser usados da mesma maneira. Em outras palavras, polimorfismo referese a situao na qual objetos pertencendo a classes diferentes podem responder a mesma mensagem, usualmente de diferentes maneiras. Por exemplo, supondo uma superclasse "Figura" usada para armazenar as dimenses de vrios objetos bidimensionais e para calcular suas reas, e trs classes derivadas "Triangulo", "Quadrado" e "Circulo", cujos objetos representam as figuras geomtricas correspondentes. Os objetos destas classes podem entender um mtodo "Mostra_Area" da superclasse, que faz com que um objeto exiba a rea da figura geomtrica correspondente na tela. Entretanto, a resposta para o mtodo "Mostra_Area" claramente diferente para os objetos "Triangulo", "Quadrado" e "Circulo". Neste caso, podese usar a mesma interface para as classes derivadas, embora estas forneam seus prprios mtodos para calcular a rea de seus objetos. O polimorfismo ajuda a reduzir a complexidade, permitindo que a mesma interface seja usada para especificar uma classe geral de aes. trabalho do compilador selecionar a ao especfica (isto , o mtodo) que se aplica a cada situao. O programador no precisa fazer essa seleo manualmente, basta apenas se lembrar da interface geral e utiliz-la. Em C++, o polimorfismo pode ser implementado atravs de funes virtuais, sendo que os nicos tipos que suportam polimorfismo so class e struct. A palavra reservada virtual permite que classes derivadas forneam verses diferentes de uma funo da superclasse. Uma vez que uma funo declarada como virtual em uma superclasse, ela pode ser redefinida em qualquer subclasse, porm os prottipos das funes virtuais nas classes derivadas devem ser idnticos ao prottipo na superclasse. As funes virtuais so especiais porque quando uma chamada por meio de um ponteiro da superclasse (ou referncia) para um objeto de uma subclasse, o C++ determina qual funo chamar durante a execuo, com base no tipo de objeto apontado. Assim, quando objetos diferentes so apontados, diferentes verses da funo virtual so executadas. Uma funo virtual declarada como virtual dentro da superclasse precedendo-se sua declarao com a palavra-chave virtual. No entanto, quando uma funo virtual redefinida por uma subclasse, a palavrachave virtual no precisa ser repetida. O prximo exemplo ilustra o conceito de polimorfismo [3, 10].
#include <iostream> using namespace std; class Base { public: virtual void quem() { // especifica uma funo virtual cout << "Base\n"; } }; class primeira_d : public Base { public: void quem() { // define quem() relativa a primeira_d cout << "Primeira derivacao\n"; } }; class segunda_d : public Base { public: void quem() { // define quem() relativo a segunda_d cout << "Segunda derivacao\n"; } }; int main() { Base base_obj; Base *p; primeira_d primeira_obj; segunda_d segunda_obj; p = &base_obj; p->quem(); // acessa quem de Base p = &primeira_obj; p->quem(); // acessa quem de primeira_d p = &segunda_obj; p->quem(); // acessa quem de segunda_d return 0; }

O ponto-chave de usar funes virtuais para obter polimorfismo durante a execuo que necessita-se acessar essas funes por meio de um ponteiro ou referncia da superclasse. Embora seja correto chamar uma funo virtual exatamente como se chama qualquer outra funo "normal" (aplicando o operador ponto

Professora Isabel Harb Manssour Linguagem de Programao C++

10

para um objeto), somente quando uma funo virtual chamada por meio de um ponteiro de superclasse (ou referncia) que o polimorfismo durante a execuo alcanado. O polimorfismo essencial para a programao orientada a objetos, pois permite que uma classe genrica especifique as funes que sero comuns a qualquer derivativo dessa classe, ao mesmo tempo em que permite a uma subclasse especificar a implementao exata de alguma ou de todas aquelas funes. Em outras palavras, a superclasse determina a interface geral que qualquer objeto derivado desta classe ter, mas permite que a subclasse defina o mtodo real. Parte do segredo para aplicar o polimorfismo com sucesso compreender que as subclasses e as superclasses formam uma hierarquia que se move da maior para a menor generalizao (da base para a derivada). Assim, quando usada corretamente, a superclasse fornece todos os elementos que uma subclasse pode usar diretamente, mais a base para aquelas funes que a subclasse precisa implementar em si mesma [10]. Ponteiro this: Resumidamente, this consiste numa "auto-referncia" a instncia de uma classe. Quando uma instncia de uma classe (objeto) criada, ela tem sua prpria cpia dos membros. Para efetivar a ligao funo membro-objeto, o C++ possui um ponteiro implicitamente criado para cada funo de classe, denominado this. Sua finalidade apontar para o objeto que chamou a funo, isto , em uma funo membro, this um ponteiro para o objeto que chamou a funo. A maior utilidade do ponteiro this o fato de ele sempre informar qual objeto est sendo referenciado no momento. Torna-se importante ressaltar que pode-se usar this apenas dentro de uma funo membro; o ponteiro no existe em qualquer outra posio [9]. O cdigo a seguir exemplifica sua utilizao.
class X { int a; public: X(int a) { this->a = a; } }; // membro da classe pode ser referenciado por this // (mais usado para manipular listas encadeadas)

Você também pode gostar