• Nenhum resultado encontrado

Objetos Objetivos do capítulo

• 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()

{

7

Naturalmente, 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.