Programando em C++
Joel Saade
Capítulo 1
Introdução
Este capítulo trata, de forma breve, a história de C e C++. Apresenta a estrutura básica de um programa C++, o mínimo necessário para o desenvolvimento de qualquer programa. Mostra a criação de um primeiro programa e ainda, de forma introdutória, o conceito de namespaces e as etapas para a criação de programas C++.
Histórico da linguagem C
A linguagem C foi desenvolvida por Dennis M. Ritchie, dos Laboratórios Bell, no início da década de 1970, quando trabalhava no projeto de desenvolvimento do Unix, que seria utilizado em um computador PDP-11 da Digital Equipment Corporation (DEC). Para a criação de um sistema operacional, é necessário uma linguagem de programação concisa, que produza um código compacto, programas rápidos e que controle o hardware de maneira eficiente. Embora a linguagem Assembly pudesse atender a tais necessidades, não seria conveniente utilizá-la, pois o Unix ficaria restrito à plataforma de hardware onde estava sendo desenvolvido. A proposta era a de que o Unix fosse executado em várias plataformas de hardware. Daí a necessidade de uma linguagem que combinasse a eficiência de uma linguagem de baixo- nível (como o Assembly) e a portabilidade de uma linguagem de alto-nível. Nesse contexto, a linguagem C foi criada.
A linguagem C herdou idéias e características de outras linguagens de programação, notadamente da linguagem BCPL, criada em 1967 por Martin Richards, e da linguagem B, criada por Ken Thompson em 1970.
Em 1978, foi publicado o livro The C Programming Language, de Brian W. Kernighan e Dennis M. Ritchie, constituindo-se na definição padrão da linguagem C. Essa primeira versão ficou conhecida como K&R C (dos sobrenomes de seus criadores, Kernighan e Ritchie). Como a linguagem C ganhou popularidade e adquiriu maturidade, o American National Standards Institute (ANSI) criou, em 1983, um comitê para estabelecer um padrão, concluído em 1989 e denominado ANSI C. Após a publicação desse padrão, o K&R C ficou conhecido como C
Histórico e características de C++
A exemplo da linguagem C, C++ também foi desenvolvida nos Laboratórios Bell, por Bjarne Stroustrup no início da década de 1980, com a primeira versão liberada em 1985. C++ baseia- se na linguagem C, a qual Stroustrup adicionou características de orientação a objetos, herdadas da linguagem Simula 67. Assim, excluindo-se detalhes, C torna-se um subconjunto de C++. Isso quer dizer que, um programa C é também um programa C++.
C++
C
Como C++ tornou-se rapidamente uma linguagem de larga utilização, em 1990, o ANSI criou um comitê, chamado ANSI X3J16, cujo objetivo era desenvolver um padrão para C++. Logo, a International Organization for Standardization (ISO), com um comitê próprio, chamado ISO-WG-21, uniu-se ao ANSI com o mesmo objetivo. Essa união é conhecida como comitê ANSI/ISO. Desde 1990, esse comitê tem publicado documentos, chamados Committee Draft (CD), referentes à padronização. Em abril de 1995, foi liberado o primeiro documento. Em dezembro de 1996, foi liberado o segundo documento, que introduziu recursos, como exceções, templates e a STL (Standard Template Library). O padrão internacional final, denominado ISO/IEC 14882:1998, foi adotado em 1998 pela ISO, pelo International Electrotechnical Committee (IEC) e pelo ANSI.
C++ é uma linguagem de propósitos gerais com uma tendência para a programação de sistemas, que suporta programação de baixo-nível nos moldes tradicionais, abstração de dados e orientação a objetos. C++ apresenta vantagens em relação à linguagem C, tais como verificação de tipos e modularização, contendo ainda melhorias que incluem constantes simbólicas, funções inline, argumentos-default para funções, sobrecarga de funções, operadores de gerenciamento de armazenagem livre (free store), referência e programação genérica.
Embora C++ utilize a biblioteca-padrão de C (definida pelo padrão ANSI C), conta com uma biblioteca mais específica, a biblioteca-padrão de classes.
O nome C++ tem origem no operador de incremento (++) da linguagem C, que adiciona 1 ao valor de uma variável. C++, então, sugere uma versão aumentada de C.
Estrutura de um programa C++
A estrutura básica de um programa C++ é simples:
#include < ... >
using namespace ...;
tipo main() {
comandos;
}
Observações:
n #include faz referência a um arquivo-cabeçalho;
n using namespace refere-se à utilização de um namespace;
n tipo indica o tipo de valor a ser retornado pela função main();
n main() é uma função obrigatória em programas C++. Todo programa tem sua execução iniciada por ela independente da sua localização, porque main() não precisa ser a pri- meira função de um programa;
n { e } indicam, o início e o fim da função main(). A seguir, um exemplo de programa C++.
// primeiro.cpp
#include <iostream>
using namespace std;
int main() {
// Exibe uma frase na tela
cout << Meu Primeiro Programa C++. O inesquecível!\n;
return 0;
}
Esse programa, embora completo, não pode ser executado. É preciso passar pelas fases de compilação e link-edição para que se torne um programa executável.
n No ambiente djgpp, digite:
gcc -c primeiro.cpp
e em seguida,
gxx -o primeiro.exe primeiro.o
No ambiente Linux, digite
g++ primeiro.cpp -o primeiro
Para executá-lo, digite
primeiro
Observações:
n Na linha #include <iostream>, iostream é um arquivo-cabeçalho.
n Na linha using namespace std;, std é um namespace.
n Na linha int main(), int é o tipo do valor a ser retornado pela função main(). É obrigató- rio.
n A linha // Exibe uma frase na tela é um comentário. Um comentário é identificado pelos caracteres // e é ignorado pelo compilador. Pode ser escrito após um comando.
n cout é um objeto de C++ que exibe informações na saída-padrão do sistema operacional (normalmente, o monitor).
n A linha return 0; encerra a execução da função main() com o valor de retorno 0. O comando return é necessário porque o valor de retorno é obrigatório.
n As linhas de comandos terminam com o caractere ; (ponto-e-vírgula).
Mais informações sobre criação, compilação e link-edição de programas C++ são encontradas nos itens Etapas para a criação de um programa e Como compilar e linkar programas, págs. 19 e 20.
Arquivos-cabeçalho
São arquivos que contêm protótipos de funções, definições de macros, declarações de tipos, de estruturas, de classes e de constantes, necessários às funções da biblioteca de C++.
Os arquivos-cabeçalho são processados em uma fase anterior à compilação chamada pré- processamento. São indicados no início do programa-fonte pela palavra-chave #include, denominada diretiva. Essa diretiva inclui no programa-fonte o arquivo-cabeçalho especificado. Um programa poderá conter quantos arquivos-cabeçalho forem necessários.
Um programador poderá criar seus arquivos-cabeçalho.
A diretiva #include possui dois formatos:
Formato Significado
#include <xxx> O arquivo-cabeçalho xxx será procurado no diretório-padrão de arquivos-cabeçalho.
#include "xxx" O arquivo-cabeçalho xxx será procurado no diretório corrente, e se não for encontrado, no diretório-padrão de arquivos-cabeçalho.
Nomes de arquivos-cabeçalho
Os compiladores C++ possuem vários arquivos-cabeçalho, cada um com sua finalidade. A utilização desses arquivos tem origem na linguagem C. Inicialmente, C++ seguiu o mesmo caminho trazendo, por exemplo, o arquivo-cabeçalho iostream.h. Num processo natural de
Os arquivos-cabeçalho da linguagem C, que foram convertidos para utilização com C++, receberam o prefixo c em seus nomes, por exemplo, ctype.h passou a se chamar cctype. Os arquivos-cabeçalho de C++ perderam o .h, mas incorporaram um novo conceito: namespace.
Arquivo-cabeçalho Extensão Exemplo Programas que utilizam
C .h ctype.h C/C++
C++ (padrão antigo) .h iostream.h C++
C++ (novo padrão) Não há iostream C++ com namespace
Convertido Não há cctype (prefixo c) C++
Namespaces: uma introdução
Imagine duas caixas de ferramentas (caixa 1 e caixa 2), cada uma com as seguintes ferramentas:
martelo e alicate. Alguém diz: Pegue o martelo. E daí a pergunta: O martelo da caixa 1 ou da caixa 2?, pois existem ferramentas iguais em caixas de ferramentas diferentes. Nota-se que é preciso uma forma para identificar as ferramentas de cada uma das caixas. Assim, o pedido poderia ser feito da seguinte forma: Pegue o martelo da caixa 1 ou Pegue o martelo da caixa 2. De forma escrita, poderia ser criada uma convenção que implicasse o seguinte:
o nome de quem contém seguido do nome de quem está contido, então, caixa1::martelo e caixa2::martelo. Situação semelhante ocorre em programas C++, não com martelos e alicates, mas com nomes de funções, variáveis, estruturas e classes.
Em uma situação real, softwares adquiridos de fontes diferentes poderão conter, embora não propositalmente, variáveis, funções, estruturas e classes com os mesmos nomes, que na tentativa de sua utilização, levaria a erros na compilação, pois o compilador não saberia qual delas utilizar. A utilização de namespaces elimina o conflito entre nomes (identificadores) iguais, permitindo que sejam utilizados em harmonia. Para ilustrar, suponha que uma mesma função, chamada calcular, conste de dois pacotes de software de empresas distintas e que cada pacote contenha o seu namespace: calc1 e calc2. Então para utilizar a função calcular, serão necessárias as notações
calc1::calcular(valor1); e calc2::calcular(valor3);
para individualizar cada uma das funções.
Namespace é o escopo onde um identificador deve ser único. Soluciona o problema de conflito de nomes iguais.
O namespace std
Nos vários arquivos-cabeçalho, há o namespace std, onde estão definidos os vários elementos que estão sob esse namespace, como por exemplo, os objetos cin e cout.
O programa seguinte mostra a utilização do namespace predefinido std. No caso, todos os
int main() {
int idade;
cout << Digite a sua idade: ;
cin >> idade;
cout << Você tem << idade << anos de idade << \n;
return 0;
}
: Resultado da execução do programa
Digite a sua idade: 29 Você tem 29 anos de idade
Mais informações sobre namespaces são encontradas no Capítulo 6 Classes de memória e namespaces.
Etapas para a criação de um programa
Um programa C++, como o do exemplo anterior, é denominado programa-fonte (extensão .cpp), que não pode ser executado pelo computador. Com o programa-fonte concluído, serão necessárias duas etapas para que o mesmo torne-se um programa executável:
n Compilação: execução de um programa (o compilador) para traduzir o programa-fonte na chamada linguagem de máquina. O programa resultante é denominado programa- objeto (extensão .o).
n Link-edição: execução de um programa (o linker) para ligar ao programa-objeto, código- objeto de funções utilizadas e rotinas-padrão de inicialização. O programa resultante é denominado programa executável. É possível também linkar vários programas-objeto para criar um único programa executável, em aplicações multiprograma. Graficamente:
Programa-fonte
Compilador
Programa-objeto
Linker
Código-objeto de funções Rotinas-padrão
Como compilar e linkar programas
Compilação e link-edição constituem duas etapas distintas. Para tanto, é necessário executar o compilador e em seguida, o linker.
Compilação de um único programa
Supondo o programa-fonte namspa01.cpp, do exemplo anterior.
n No ambiente djgpp Para compilar, digite:
gcc -c namspa01.cpp
Não havendo erros no programa namspa01.cpp, será criado o programa-objeto namspa01.o. Para linkar, digite:
gxx -o namspa01.exe namspa01.o
Será criado o programa executável namspa01.exe.
n No ambiente Linux
Para compilar e linkar, digite:
g++ namspa01.cpp -o namspa01
Será criado o programa executável namspa01.
Compilação de vários programas
Supondo os programas-fonte prog01.cpp e prog02.cpp.
n No ambiente djgpp Para compilar, digite:
gcc -c prog01.cpp prog02.cpp
Não havendo erros nos programas prog01.cpp e prog02.cpp, serão criados os progra- mas-objeto prog01.o e prog02.o.
Para linkar, digite:
gxx -o prog99.exe prog01.o prog02.o
Será criado o programa executável prog99.exe.
n No ambiente Linux
Para compilar e linkar, digite:
g++ prog01.cpp prog02.cpp -o prog99
Será criado o programa executável prog99.
Automatizando a compilação e a link-edição de programas
No ambiente djgpp, para evitar a digitação das duas linhas, é possível criar um arquivo .bat para automatizar a compilação e a link-edição.
Crie um arquivo-texto chamado, por exemplo, cl.bat com o o seguinte conteúdo:
CLS
gcc -c %1.cpp
IF NOT EXIST %1.o GOTO fim gxx -o %1.exe %1.o
:fim
Para compilar e linkar seus programas, digite cl e o nome do programa-fonte, sem a extensão, pois já está no arquivo cl.bat:
cl prog01
Teste seus conhecimentos
1. Escreva F para sentenças falsas e V para sentenças verdadeiras.
1. A linguagem C foi desenvolvida nos laboratórios da Hewlett-Packard (HP). ( )
2. A primeira versão da linguagem C também é conhecida como K&R C. ( )
3. A linguagem C++ foi desenvolvida nos Laboratórios Bell, por Bjarne Stroustrup. ( )
4. ANSI C é a denominação dada à linguagem C após a sua padronização pelo ANSI. ( )
5. Com a criação de C++, a linguagem C torna-se um subconjunto de C++. ( )
6. A função main() é opcional em programas C++. ( )
7. #include é uma diretiva utilizada na fase de pré-processamento. ( )
8. O uso de namespaces permite que identificadores iguais sejam utilizados sem conflitos. ( )
9. Os arquivos-cabeçalho são processados na fase de pré-processamento. ( )
10. Para que um programa C++ possa ser executado, precisa passar pelas fases de link-edição e compilação. ( )
11. Um programa C++ escrito pelo programador é denominado programa-objeto. ( )