12 Dezembro 2017 Ter

2 visitantes e 0 Usuários online

  Indique Download Forums Links Polita de Privacidade
PC-SOS :: Programação :: C++ Como uma Linguagem orientada a obejtos
PC-SOS
Notícias
Anúncios
Estatística
FAQ
Usuários
Usuários Online
Conteúdo
1-Política de Privacidade
Artigos
Celular
Flash
Linux
Discos Rígidos
Hardware
Internet
Modem
MSOffice
MSOffice - Excel
Multimedia
Photoshop
Programação
Rede
Segurança
Sistema Operacional
Software
Software p/ PenDrive
Termos & Siglas
WEB
Windows
Xoops
Área de Usuário

Usuário:
Senha:
Lembrar!
Esqueci minha senha
Registrar

Pesquisa Avançada

Patrocinadores

 


Teste de Velocidade

Desenvolvido por

 

 

 

2.01.2009
Como configurar o Windows para aceitar 8GB de RAM
3.12.2008
Quando Pen Drive USB Não Aparece No Windows
15.02.2008
BBS, sistema que foi o antecessor da internet
26.11.2007
Firefox 3.0
5.10.2007
Hitachi trabalha em Blu-Ray de 100GB e 200GB
24.09.2007
Novo supercomputador entra em operação no Brasil
24.09.2007
IBM oferece software gratuito de edição de texto
19.09.2007
Processador com 80 NÚCLEOS
19.09.2007
IBM terá suíte de escritório gratuita
17.09.2007
Clone do Office online, e grátis

C++ Como uma Linguagem orientada a obejtos
10.07.2005
PROGRAMAÇÃO ORIENTADA A OBJETOS 1. CLASSES E OBJETOS
Este tutorial se propõe a ensinar programação orientada a objetos em C++. A maioria dos livros não apresenta a linguagem nesse contexto, dando uma atenção maior para os recursos de C++ do que para a metodologia de programação. É recomendável que o leitor tenha acesso a um desses livros visto que não ensinaremos aqui aspectos considerados básicos que são em geral quase todos que permitem usar C++ como um C melhorado. Você pode usar C++, como uma linguagem procedural com recursos avançados, mais uma vez não é isso que pretendemos ensinar neste texto. Na prática de programação orientada a objetos estaremos atentos em nossos programas para pontos como:
- Segurança.
- Facilidade de integração.
- Facilidade de extensão.
- Eficiência.
Os tópicos seguintes nos guiarão nesses objetivos, mostrando numa curva de aprendizado suave, como programar usando orientação a objetos em C++.

Uma classe é um tipo definido pelo usuário que contém o molde, a especificação para os objetos, assim como o tipo inteiro contém o molde para as variáveis declaradas como inteiros. A classe envolve, associa, funções e dados, controlando o acesso a estes, definí-la implica em especificar os seus atributos (dados) e suas funções membro (código).
Um programa que utiliza uma interface controladora de um motor elétrico provavelmente definiria a classe motor. Os atributos desta classe seriam: temperatura, velocidade, tensão aplicada. Estes provavelmente seriam representados na classe por tipos como float ou long . As funções membro desta classe seriam funções para alterar a velocidade, ler a temperatura, etc.
Um programa editor de textos definiria a classe parágrafo que teria como um de seus atributos uma string ou um vetor de strings, e como funções membro, funções que operam sobre estas strings. Quando um novo parágrafo é digitado no texto, o editor cria a partir da classe parágrafo um objeto contendo as informações particulares do novo texto. Isto se chama instanciação ou criação do objeto.
Classes podem ser declaradas usando a palavra reservada struct ou a palavra reservada class, nos exemplos posteriores entraremos em mais detalhes. As classes do próximo tópico 1.2 são declaradas com Transfer interrupted! áticas. Quando chegarmos em encapsulamento 1.3 mostraremos como declarar classes com class e não usaremos mais struct no tutorial.
1.1. ESPECIFICANDO UMA CLASSE
Suponha um programa que controla um motor elétrico através de uma saída serial. A velocidade do motor é proporcional a tensão aplicada, e esta proporcional aos bits que vão para saída serial e passando por um conversor digital analógico.
Vamos abstrair todos estes detalhes por enquanto e modelar somente a interface do motor como uma classe, a pergunta é que funções e que dados membro deve ter nossa classe, e que argumentos e valores de retorno devem ter essas funções membro:

Representação da velocidade:
A velocidade do motor será representada por um atributo, ou dado membro, inteiro (int). Usaremos a faixa de bits que precisarmos, caso o valor de bits necessário não possa ser fornecido pelo tipo , usaremos então o tipo long , isto depende do conversor digital analógico utilizado e do compilador.

Representação da saída serial:
O motor precisa conhecer a sua saída serial, a sua ligação com o "motor do mundo real". Suponha uma representação em hexadecimal do atributo endereço de porta serial, um possível nome para o atributo: enderecomotor. Não se preocupe em saber como usar a representação hexadecimal.

Alteração do valor da velocidade:
Internamente o usuário da classe motor pode desejar alterar a velocidade, cria-se então o método ( em C++ função membro): void altera_velocidade(int novav); . O código anterior corresponde ao cabeçalho da função membro, ela é definida junto com a classe motor, associada a ela. O valor de retorno da função é void (valor vazio), poderia ser criado um valor de retorno (int) que indicasse se o valor de velocidade era permitido e foi alterado ou não era permitido e portanto não foi alterado.
Não faz sentido usar, chamar, esta função membro separada de uma variável do tipo motor, mas então porque na lista de argumentos não se encontra um motor? Este pensamento reflete a maneira de associar dados e código (funções) das linguagens procedurais. Em linguagens orientadas a objetos o código e os dados são ligados de forma diferente, a própria declaração de um tipo definido pelo usuário já engloba as declarações das funções inerentes a este tipo, isto será explicado em 1.2.2.
Note que não fornecemos o código da função, isto não é importante, por hora a preocupação é com a interface definida pela classe: suas funções membro e dados membro. Apenas pense que sua interface deve ser flexível de modo a não apresentar entraves para a criação do código que seria feita numa outra etapa. Nesta etapa teríamos que imaginar que o valor numérico da velocidade deve ir para o conversor onde irá se transformar numa diferença de potencial a ser aplicada nos terminais do motor, etc.

Um diagrama simplificado da classe motor com os dados membro e as funções membro:
Exercícios:
1)Lembre-se de algum programa em que você trabalhou, cite que tipos de classes seriam criadas se esse programa fosse escrito em C++, que atributos e que funções membro estariam associadas a esses objetos?
Exemplo: "Eu trabalhei em um programa de contas a pagar e contas a receber. Se esse programa fosse escrito em C++ eu definiria a classe conta_bancaria. Os atributos seriam: saldo, taxa_de_juros, limite_de_saque, etc. Minha opção seria por representá-los como variáveis do tipo float. "
"Dentre as funções membros desta classe estariam funções para efetuar saques, depósitos e computar juros."
1.2. STRUCT EM C++
Objetos são instâncias de uma classe. Quando um objeto é criado ele precisa ser inicializado, ou seja para uma única classe : Estudante de graduação podemos ter vários objetos num programa: Estudante de graduação Carlos, Identificação 941218, Curso Computação; Estudante de graduação Luiza , Identificação 943249, Curso Engenharia Civil... A classe representa somente o molde para a criação dos objetos, estes sim contém informação, veja tópico classes e objetos.
1.2.1. ATRIBUTOS OU DADOS MEMBRO.
Este exemplo declara uma struct e em seguida cria um objeto deste tipo em main alterando o conteúdo desta variável. Uma struct é parecida com um record de Pascal, a nossa representa um círculo com os atributos raio, posição x , posição y, que são coordenadas cartesianas. Note que este objeto não possui funções membro ainda.
#include
struct circulo
//struct que representa um circulo.
{
float raio;
float x;
//posicoes em coordenadas cartesianas
float y;
};

void main()
{
circulo ac;
//criacao de variavel , veja comentarios.
ac.raio=10.0;
//modificacao de conteudo (atributos) da struct
ac.x=1.0;
//colocando o circulo em uma posicao determinada
ac.y=1.0;
//colocando o circulo em uma posicao determinada
cout << "Raio:"<
//verificacao dos atributos alterados.
cout << "X:"<
cout << "Y:" <
}
Resultado do programa:
Raio:10
X:1
Y:1

Comentários:
struct circulo
//struct que representa um circulo.
{
float raio;
float x;
//posicoes em coordenadas cartesianas
float y;
};
Este código é a declaração da classe círculo, entre chaves vem os dados membro e as funções membro que não foram apresentadas ainda.
A sintaxe para criação de objetos da classe círculo (circulo ac;) , por enquanto não difere da sintaxe para a criação de variáveis do tipo int.
O acesso aos dados membro deve ser feito usando o nome do objeto e o nome do dado membro, separados por um ponto: ac.raio=10.0; . Note que raio sozinho não faz sentido no programa, precisa-se especificar de que objeto se deseja acessar o raio.

Aos que programam em C:
Os programadores C podem notar algo interessante: "C++ não requer a palavra struct na declaração da variável, ela se comporta como um tipo qualquer: int , float ...". Outros programadores que não haviam usado struct previamente em C não se preocupem, façam apenas os exercícios deste exemplo e estarão aptos a prosseguir.

Exercícios:
1) Repita o mesmo exemplo só que agora mova o círculo alterando as componentes x e y. Ponha o círculo em (0.0,0.0) através de atribuições do tipo ac.x=1.0; mova o círculo para (1.0,1.0). Acompanhe todas as modificações da struct através de cout's.

2)Simplifique o programa anterior retirando o atributo raio. Você pode dar o nome de ponto ou ponto_geometico para esta classe.
1.2.2. MÉTODOS OU FUNÇÕES MEMBRO.
C++ permite que se acrescente funções de manipulação da struct em sua declaração, juntando tudo numa só entidade que é uma classe. Essas funções membro podem ter sua declaração (cabeçalho) e implementação (código) dentro da struct ou só o cabeçalho (assinatura) na struct e a implementação, código, fora. Este exemplo apresenta a primeira versão, o próximo a segunda versão (implementação fora da classe).
Essas funções compõem a interface da classe. A terminologia usada para designá-las é bastante variada: funções membro, métodos, etc. Quando uma função membro é chamada, se diz que o objeto está recebendo uma mensagem (para executar uma ação).

Um programa simples para testes sobre funções membro seria o seguinte:

#include

struct contador
//conta ocorrencias de algo
{
int num;
//numero do contador
void incrementa(void){num=num+1;};
//incrementa contador
void comeca(void){num=0;};
//comeca a contar
};

void main()
//teste do contador
{
contador umcontador;
umcontador.comeca();
//nao esqueca dos parenteses, e uma funcao membro e nao atributo!
cout << umcontador.num << endl;
umcontador.incrementa();
cout << umcontador.num << endl;
}
Resultado do programa:
0
1

Comentários:
O programa define um objeto que serve como contador, a implementação representa a contagem no atributo num que é um número inteiro. As funções membro são simples: incrementa adiciona um ao contador em qualquer estado e comeca inicializa a contagem em zero.

Sintaxe:
A sintaxe para declaração de funções membro dentro de uma classe é a mesma sintaxe de declaração de funções comuns : tipoderetorno nomedafuncao(lista_de_argumentos) { /*codigo */ }. A diferença é que como a função membro está definida na classe, ela ganho acesso direto aos dados membros, sem precisar usar o "ponto", exemplo um_objeto.dadomembro; . Lembre-se que as chamadas de funções membro já se referem a um objeto específico, embora elas sejam definidas de uma forma geral para toda a classe.
A sintaxe de chamada ou acesso à funções membro é semelhante a sintaxe de acesso aos dados membro com exceção dos parênteses que contém a lista de argumentos da função, mesmo que a lista seja vazia eles devem estar presentes: umcontador.incrementa();. Primeiro insere-se o nome do objeto e depois a chamada da função, estes são separados por um ponto. Cuidado para não esquecer os parênteses nas chamadas de funções membro em programas futuros, este é um erro bastante comum.

Agora o programa mais complicado, porém baseado no exemplo 1.2.1:

#include //para cout

struct circulo
{
float raio;
float x;
//atributo coordenada cartesiana x
float y;
//atributo coordenada cartesiana y

void move(float dx,float dy)
//função membro ou função membro move
{
x+=dx;
//equivale a x=x+dx;
y+=dy;
}
void mostra(void) //função membro ou função membro mostra
{
cout << "Raio:"<
cout << "X:"<
cout << "Y:" <
}
};
void main()
{
circulo ac;
// * instanciação de um objeto circulo (criacao)
ac.x=0.0;
ac.y=0.0;
ac.raio=10.0;

ac.mostra();
ac.move(1.0,1.0);
ac.mostra();
ac.x=100.0;
ac.mostra();
}
Resultado do programa:
Raio:10
X:0
Y:0
Raio:10
X:1
Y:1
Raio:10
X:100
Y:1

Comentários:
A função membro move altera as coordenadas do objeto. O objeto tem suas coordenadas x e y somadas com os argumentos dessa função membro. Note que esta função membro representa uma maneira mais segura, clara, elegante de alterar as coordenadas do objeto do que acessá-las diretamente da seguinte forma: ac.x+=dx;. ac.y+=dy;. Lembre-se que ac.x+=dx é uma abreviação para ac.x=ac.x+dx; .

Como funcionam no compilador as chamadas de funções membro:
É possível imaginar que as definições de funções membro ocupam um grande espaço na representação interna dos objetos, mas lembre-se que elas são todas iguais para uma classe então basta manter para cada classe uma tabela de funções membro que é consultada no momento da chamada . Os objetos só precisam ter uma referência para esta tabela.

Exercícios:
1)Neste mesmo programa, crie uma função para a struct chamada "inicializa" que deve ter como argumentos um valor para x, um para y e outro para o raio, e deve alterar os atributos inicializando-os com os valores passados.
Você pode abstrair o uso dessa função como uma maneira de inicializar o objeto de uma só vez embora a função o faça seqüencialmente. Comente as vantagens de fazê-lo, comparando com as outras opções, tenha sempre em mente a questão de segurança quando avaliar técnicas diferentes de programação.

2)No programa anterior, verifique que nada impede que você acesse diretamente os valores de x , y e raio e os modifique. Como você pode criar um número enorme de funções : altera_x(float a); move_raio(float dr); seria desejável que somente essas funções pudessem modificar x, y e raio. Você verá que isso é possível em encapsulamento 1.3. Por hora, crie essas funções.

3)Teste a função membro move com argumentos negativos, exemplo ac.move(-1.0,-1.5);. O resultado é coerente?

4)Crie uma nova struct que representa um ponto, que informações você precisa armazenar? Que funções seriam úteis ? Faça um programa para testar sua classe.

5)Melhore a classe contador, defina uma função que imprime o contador na tela. Se você estivesse fazendo um programa para rodar numa interface gráfica com o usuário esta função de imprimir na tela seria a mesma? Definir uma função que retorna uma copia do valor atual do contador garante maior portabilidade? Por quê? Para aprender a retornar valores consulte: 1.2.3.

6)"Há uma tendência em definir o maior número de funções membro em uma classe, porque nunca se pode prever exatamente o seu uso em programas futuros". Comente esta frase, tendo em vista o conceito de portabilidade. Você já é capaz de citar outras medidas que tornem suas classes mais portáveis? Leia o exercício anterior.
1.2.3. FUNÇÕES MEMBRO QUE RETORNAM VALORES.
Até agora só tínhamos visto funções membro com valor de retorno igual a void. Uma função membro, assim como uma função comum, pode retornar qualquer tipo, inclusive os definidos pelo usuário. Sendo assim, sua chamada no programa se aplica a qualquer lugar onde se espera um tipo igual ou equivalente ao tipo do seu valor de retorno, seja numa lista de argumentos de outra função , numa atribuição ou num operador como o cout << variavel;
#include

struct contador
//conta ocorrencias de algo
{
int num;
//numero, posicao do contador
void incrementa(void){num=num+1;};
//incrementa contador
void comeca(void){num=0;};
//comeca a contar, "reset"
int retorna_num(void) {return num;};
};

void main()
//teste do contador
{
contador umcontador;
umcontador.comeca();
//nao esqueca dos parenteses, e uma funcao membro nao dado!
cout << umcontador.retorna_num() << endl;
umcontador.incrementa();
cout << umcontador.retorna_num() << endl;
}
Resultado do programa:
0
1
1.2.4. FUNÇÕES DECLARADAS EXTERNAS A CLASSE , FUNÇÕES MEMBRO CHAMAMANDO FUNÇÕES MEMBRO.
Este exemplo apresenta a implementação, definição, das funções fora da declaração da struct. Além disso introduz uma nova função chamada "inicializa" e funções float retorna_raio(void); e void altera_raio(float a). Inicializa coloca o ponto nas coordenadas passadas como seus argumentos. Introduzimos esta função membro aqui para preparar a explicação sobre construtores dada no próximo exemplo: 1.2.6.

Comentários:
Em uma declaração de uma classe normalmente se coloca a declaração das funções membro depois da declaração dos atributos, porém podemos fazer intercalações ou adotar qualquer ordem que nos convenha.
O programador não é obrigado a implementar as funções membro dentro da declaração da classe, basta defini-las e apresentar a implementação em separado segundo a sintaxe (compilável) descrita a seguir:

#include

struct teste
{
int x;
void altera_x(int v);
//somente definicao implementacao vem depois, fora da classe
};

void teste::altera_x(int v) { x=v;}
//esta ja e a implementacao codigo
void main()
{
teste a;
//instaciacao de um objeto
a.altera_x(10);
//chamada da funcao membro com valor 10 que sera impresso a seguir
cout << a.x;
//imprimindo o dado membro
}
Resultado do programa anterior:
10

Programa exemplo círculo, mais complexo baseado no exemplo de 1.2.2:

#include
//para cout

struct circulo
{
float raio;
float x;
float y;

void inicializa(float ax,float by,float cr);
void altera_raio(float a);
float retorna_raio(void);
void move(float dx,float dy);
void mostra(void);

};

void circulo::inicializa(float ax,float by,float cr)
{
x=ax;
y=by;
raio=cr;
}
void circulo::altera_raio(float a)
{
raio=a;
}
float circulo::retorna_raio(void)
{
return raio;
}

void circulo::move(float dx,float dy)
{
x+=dx;
y+=dy;
}

void circulo::mostra(void)
{
cout << "Raio:"<< retorna_raio() <
cout << "X:"<
cout << "Y:" <
}

void main()
{
circulo ac;
ac.inicializa(0.0,0.0,10.0);
ac.mostra();
ac.move(1.0,1.0);
ac.mostra();
ac.x=100.0;
ac.altera_raio(12.0);
ac.mostra();
}
Comentários:
Observe que a função membro mostra chama a função membro float retorna_raio(void) que é da mesma classe. Fica implícito da definição de mostra que retorna_raio() se aplica ao mesmo objeto instanciado que recebeu a chamada de mostra, ou seja, não é necessário usar o . na chamada de retorna_raio(). Em programas maiores, chamadas aninhadas de funções membro são bastante comuns.

Programação orientada a objetos e interfaces gráficas com o usuário:
Existem "libraries" de classes que permitem o programador C++ desenvolver aplicações para ambientes como o Microsoft Windowsreg. de uma maneira bastante abstrata, este é um exemplo claro de reuso de código, afinal o programador não precisa saber de detalhes da interface para programar nela.

Resultado do programa:
Raio:10
X:0
Y:0
Raio:10
X:1
Y:1
Raio:12.0
X:100.0
Y:1

Exercícios:
1)Implemente outras funções do estilo void altera_raio(float a) e float retorna_raio(void) para os atributos X e Y.

2)Faça um programa simples para testar uma struct que representa um mouse e que contém a posição na tela, os indicadores de estado dos botões e os função membros: clica_botaoA(void); move(float dx, float dy);. Não é preciso fazer a ligação da struct com a entrada serial, embora o leitor interessado possa encontrar na literatura de C exemplos de como fazê-lo, esta é uma tarefa complicada.
Seu mouse deve ser capaz de caminhar para qualquer lugar da tela através de chamadas de funções membro, não deve ultrapassar os limites estabelecidos, e deve indicar se os botões estão pressionados ou não através de uma função semelhante a função mostra( ) deste exemplo. O mouse pode ter de 1 a 3 botões. E você pode substituir a função membro move(float dx,float dy) por move_x(float dx); e move_y(float dy);

1.2.5. ALGO PARECIDO EM UMA LINGUAGEM PROCEDURAL

Este tópico apresenta uma comparação entre C++ e Pascal, para tal implementou-se dois programas semelhantes. O programa C++ é o programa círculo do tópico anterior: 1.2.4. O programa em Pascal vem a seguir:
PROGRAM Comparacao;
{COMPARACAO COM UM PROGRAMA C++}

TYPE Circulo=RECORD
x:real;
{COORDENADAS X E Y}
y:real;
r:real;
{somente dados}
END;

var ac:circulo;
leitura:integer;

PROCEDURE Inicializa(var altereme:Circulo;ax,by,cr:real);
{COLOCA O CIRCULO EM DETERMINADA POSICAO}
BEGIN
altereme.x:=ax;
altereme.y:=by;
altereme.r:=cr;
END;

PROCEDURE Altera_Raio(var altereme:Circulo;ar:real);
{ALTERA O RAIO DO CIRCULO}
BEGIN
altereme.r:=ar;
END;

FUNCTION Retorna_Raio(copieme:Circulo):real;
BEGIN
Retorna_Raio:=copieme.r;
END;

PROCEDURE Move(var altereme:Circulo;dx,dy:real);
{MODE AS COORDENADAS X E Y ACRESCENTANDO DX E DY}
BEGIN
altereme.x:=altereme.x+dx;
altereme.y:=altereme.y+dy;
END;

PROCEDURE Mostra(copieme:Circulo);
{MOSTRA O CIRCULO NA TELA}
BEGIN
writeln('X:',copieme.x,' Y:',copieme.y,' R:',copieme.r);
END;
BEGIN
{TESTES}
Inicializa(ac,0.0,0.0,10.0);
Mostra(ac);
Move(ac,1.0,1.0);
Mostra(ac);
ac.x:=100.0;
Altera_Raio(ac,12.0);
Mostra(ac);
read(leitura);
END.
PC-SOS
Hits: 1681
Programação >>
 Ruim  Bom 
Comentário de Usuário: Nosso usuário podem revisar conteúdos

 

 

 

     

Número de visitas deste fev/2005 - Número de consultas ao site:

  © Copyright 2005 PC SOS. All Rights Reserved. contato@robweb.com.br