• Familiarizar-se com objetos
• Aprender sobre propriedades de várias classes de exemplo que foram projetadas pa- ra este livro
• Tornar-se apto a construir objetos e fornecer valores iniciais • Entender funções membro e a notação ponto
• Tornar-se apto a modificar e consultar o estado de um objeto através de funções membro
• Escrever programas gráficos simples contendo pontos, linhas, círculos e texto (op- cional)
Você aprendeu sobre os tipos de dados básicos de C++: números e strings. Embora se- ja possível escrever programas interessantes usando somente números e strings, programas mais úteis precisam manipular itens de dados que são mais complexos e que representem da melhor forma possível as entidades do mundo real. Exemplos destes itens de dados são registros de empregados ou formas gráficas.
A linguagem C++ é ideal para projetar e manipular esses itens de dados, ou, como eles são usualmente chamados, objetos. Requer um certo grau de competência técnica projetar novos tipos de objetos, mas é bastante fácil manipular objetos que foram projetados por ou- tros. Entretanto, você primeiro irá aprender como usar objetos que foram especificamente projetados para usar com este livro texto. No Capítulo 6 você irá aprender como definir es- tes e outros objetos. Algumas das mais interessantes estruturas de dados que nós examina- mos são provenientes da área de gráficos. Neste capítulo você vai aprender como usar ob- jetos que permitem desenhar formas gráficas na tela do computador.
Para manter a programação simples, apresentamos somente alguns blocos de constru- ção. Você vai ver que a habilidade de desenhar gráficos simples torna a programação muito mais divertida. Entretanto, o uso da biblioteca de gráficos é inteiramente opcional. O res- tante deste livro não depende de gráficos.
3.1
Construindo objetos
Um objeto é um valor que pode ser criado, armazenado, e manipulado em uma linguagem de pro- gramação.
Neste sentido, o string"Hello"é um objeto. Você pode criá-lo simplesmente usando a nota- ção de string em C++ "Hello". Você pode armazená-lo em uma variável assim:
string greeting = "Hello";
Você pode manipulá-lo, por exemplo, extraindo um substring: cout << greeting.substr(0, 4);
Esta manipulação, em particular, não afeta o objeto. Após o substring ter sido computado, o string original permanece inalterado. Você vai ver manipulações em objetos que realmente alteram objetos mais adiante neste capítulo.
Em C++ cada objeto deve pertencer a uma classe. Uma classe é um tipo de dado, assim como
intou double. Entretanto, classes são definidas pelo programador, enquanto int e double
são definidos pelos projetistas da linguagem C++. Neste momento você ainda não vai aprender co- mo definir suas próprias classes, de modo que a distinção entre tipos fundamentais e tipos de clas- ses definidas pelo programador ainda não é importante.
Neste capítulo você vai aprender a trabalhar com a classe Time, a classe Employeee quatro classes que representam formas gráficas. Estas classes não fazem parte de C++ padrão; elas foram criadas para uso neste livro.
Para usar a classe Time, você precisa incluir o arquivo ccc_time.h. Diferentemente dos ca- beçalhosiostreamou cmath, este arquivo não faz parte dos cabeçalhos padrão de C++. Mas sim, a classe Timeé fornecida com este livro para ilustrar objetos simples. Visto que o arquivo
ccc_time.h não é um cabeçalho do sistema, você não usa os símbolos < > na diretiva #in- clude; em vez disso, você usa aspas:
#include "ccc_time.h" 3.1 Construindo objetos 92
Sintaxe 3.1: Construção de objeto 93
Sintaxe 3.2: Definição de variável objeto
93
3.2 Usando objetos 94
Erro freqüente 3.1:
Tentar chamar uma função-membro sem uma variável 96
Dica de produtividade 3.1: Atalhos de teclado para operações com mouse 97 3.3 Objetos da vida real 98
Dica de produtividade 3.2: Usando a linha de comando efetivamente 100
Fato histórico 3.1: Mainframes – quando os dinossauros reinavam na Terra 100 3.4 Exibindo formas gráficas 102
3.5 Estruturas gráficas 102
Dica de produtividade 3.3: Pense em pontos como objetos, e não como pares de números 106 Fato histórico 3.2: Gráficos em computadores 106 3.6 Escolhendo um sistema de coordenadas 108 Dica de produtividade 3.4:
Escolha um sistema de coordenadas conveniente 110
3.7 Obtendo entradas a partir de janelas gráficas 112
3.8 Comparando informações visuais e numéricas 112
Dica de qualidade 3.1: Calcular manualmente dados de teste 115
Fato histórico 3.3: Redes de computadores e a Internet 116
O prefixo CCCé outro lembrete que este arquivo de cabeçalho é específico do livro; CCCé o acrônimo de Computing Concepts with C++ Essentials. A documentação online da biblioteca de código que acompanha este livro fornece maiores instruções sobre como acrescentar o código dos objetos CCCao seu programa.
Suponha que você quer saber quantos segundos irão transcorrer entre agora e a meia-noite. Is- to parece ser doloroso de calcular manualmente. Entretanto, a classe Timetorna fácil este traba- lho. Você vai ver como, nesta seção e na seguinte. Primeiro, você vai aprender como especificar um objeto do tipo Time. O final do dia é 11:59 P.M. e 59 segundos. Aqui está um objeto Timeque re- presenta esta hora:
Time(23, 59, 59)
Você especifica um objeto Timefornecendo três valores: horas, minutos e segundos. As horas são dadas no “horário militar”: entre 0 e 23 horas.
Quando um objeto Time é especificado a partir de três valores inteiros como 23, 59, 59, dize- mos que o objeto é construído com estes valores e os valores usados na construção são os parâmetros de construção. Em geral, um objeto é construído como mostrado na Sintaxe 3.1.
Você deve pensar no objeto de horário como uma entidade que é bastante similar a um número tal como 7.5ou um string tal como "Olá". Assim como valores em ponto flutuante podem ser armazenados em variáveis double, objetos Timepodem ser armazenados em variáveis Time:
Time day_end = Time(23, 59, 59);
Pense nisso como sendo análogo a double interest_rate = 7.5;
ou
string greeting = "Olá";
Existe um atalho para esta situação bastante comum (ver Sintaxe 3.2). Time day_end(23, 59, 59);
Isso define uma variável day_end que é inicializada como o objeto Time, Ti-
me(23,59,59)(ver Figura 1).
Sintaxe 3.2: Definição de Variável Objeto
Class_name variable_name(construction parameters); Exemplo:
Time homework_due(19, 0, 0); Finalidade:
Define uma nova variável objeto e fornece valores dos parâmetros de inicialização.
Sintaxe 3.1: Construção de Objeto
Class_name(construction parameters) Exemplo:
Time(19, 0, 0) Finalidade:
Muitas classes possuem mais de um mecanismo de construção. Existem dois métodos para construir horários: especificando horas, minutos e segundos e sem especificar nenhum parâmetro. A expressão
Time()
cria um objeto representando o horário atual, isto é, o horário de quando o objeto é construído. Criar um objeto sem parâmetro de construção é chamado de construção default.
Naturalmente, você pode armazenar o objeto Time default em uma variável: Time now = Time();
A notação de atalho para usar a construção default é levemente inconsistente:
Time now; /* OK. Isto define uma variável e chama o construtor default. */
e não
Time now(); /* NÃO! Isto não define uma variável */
Por estranhas razões históricas, você pode não usar ()quando define uma variável com cons- trução default.
3.2
Usando objetos
Uma vez que você tem uma variável Time, o que você pode fazer com ela? Aqui está uma opera- ção útil: você pode adicionar um certo número de segundos ao horário:
wake_up.add_seconds(1000);
Após isto, o objeto na variável wake_upé alterado. Não mais possui o valor de hora atribuí- do quando o objeto foi construído, mas um objeto Timeque representa um horário exatamente 1.000 segundos além do horário previamente armazenado em wake_up(ver Figura 2).
23:59:59
day_end = Time
Figura 1
Um objeto Time.
Figura 2
Alterando o estado de um objeto.
7:00:00 wake_up = Time 7:16:40 wake_up = Time wake_up.add_seconds(1000); Depois:
Sempre que você aplica uma função (tal como add_seconds) a uma variável objeto (tal co- mo wake_up), você usa a mesma notação ponto que já usamos para certas funções string:
int n = greeting.length(); cout << greeting.substr(0, 4);
Uma função que é aplicada a um objeto com a notação ponto é denominada função-membro em C++. Agora que você viu como alterar o estado de um objeto de horário, como pode saber o horá- rio atualmente armazenado no objeto? Você tem que perguntar. Existem três funções-membro pa- ra esta finalidade, denominadas
get_seconds() get_minutes() get_hours()
Elas também são aplicadas a objetos usando a notação ponto (ver Figura 3).
Arquivo time1.cpp 1 #include <iostream> 2 3 using namespace std; 4 5 #include "ccc_time.h" 6 7 int main() 8 { 9 Time wake_up(7, 0, 0);
10 wake_up.add_seconds(1000); /* mil segundos mais tarde */
11 cout << wake_up.get_hours() 12 << ":" << wake_up.get_minutes() 13 << ":" << wake_up.get_seconds() << "\n"; 14 15 return 0; 16 }
Esse programa exibe 7:16:40
Já que você pode obter (get) o valor de hora do objeto horário, parece ser natural sugerir que você também pode defini-lo (set):
homework_due.set_hours(2); /* Não! Não é função-membro */
Objetos Timenão possuem esta função-membro. Existe uma boa razão, naturalmente. Nem to- dos os valores de hora fazem sentido. Por exemplo,
homework_due.set_hours(9999); /* Não faz sentido */
Figura 3
Consultando o estado de um objeto.
7:16:40
wake_up = Time
wake_up.get_hours()
{
7Naturalmente, alguém poderia tentar dar um significado para tal chamada, mas o autor da classe
Timedecidiu simplesmente não fornecer estas funções-membro. Sempre que você usar um objeto, precisa saber quais funções-membro são fornecidas; outras operações, embora possam ser úteis, sim- plesmente não são possíveis. A classe Timepossui somente uma função-membro que pode modifi- car objetos Time: add_seconds. Por exemplo, para avançar uma hora no horário, você pode usar
const int SECONDS_PER_HOUR = 60 * 60; homework_due.add_seconds(SECONDS_PER_HOUR);
Você pode retroceder em uma hora o horário:
homework_due.add_seconds(-SECONDS_PER_HOUR);
Se você está completamente descontente com o atual objeto armazenado em uma variável, po- de sobrescrevê-lo com um outro:
homework_due = Time(23, 59, 59);
A Figura 4 mostra essa substituição.
Existe uma última função-membro que a variável de horário pode executar: ela pode descobrir o número de segundos entre ela mesma e outro horário. Por exemplo, o programa seguinte calcula o número de segundos entre o horário atual e o último segundo do dia.
Arquivo time2.cpp 1 #include <iostream> 2 3 using namespace std; 4 5 #include "ccc_time.h" 6 7 int main() 8 { 9 Time now; 10 Time day_end(23, 59, 59);
11 int seconds_left = day_end.seconds_from(now);
12
13 cout << "Ainda faltam "
14 << seconds_left
15 << " segundos para o fim do dia de hoje.\n";
16
17 return 0;
18 }
Para resumir, em C++ objetos são construídos escrevendo um nome de classe, seguido por pa- râmetros de construção entre parênteses. Existe uma notação abreviada para inicializar uma variá- vel objeto. Funções-membro são aplicadas a objetos e variáveis objeto com a notação ponto. As funções da classe Timesão listadas na Tabela 1.