[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]Esta é uma série de artigos que vamos apresentar para que você aprenda a linguagem C. Neste primeiro vamos iniciar com a teoria do C. O que são classes, objetos, métodos, etc.



Classes e Objetos

Uma classe é um tipo definido pelo programador que contém o molde, a especificação para os objetos, tal como o tipo inteiro contém o molde para as variáveis declaradas como inteiros. A classe envolve e/ou associa, funções e dados, controlando o acesso a estes, defini-la implica especificar os seus atributos ( dados ) e suas funções membro ( código ).

ex.: Um programa que utiliza uma interface controladora de um motor elétrico definiria a classe motor. Os atributos desta classe seriam: temperatura, velocidade, tensão aplicada. Estes 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.


Especificar uma Classe

Vamos supor um programa que controla um motor elétrico através de uma saída serie. A velocidade do motor é proporcional à tensão aplicada, e esta proporcional aos bits que vão para saída serie que passam por um conversor digital analógico ( DAC ).

Vamos abstrair de 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, inteiro (int). Usaremos o número 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 série
O motor precisa conhecer a saída serie, a sua ligação com o "motor do mundo real". Vamos supor uma representação em hexadecimal do atributo endereço de porta serie, um possível nome para o atributo: enderecomotor.

Alteração do valor da velocidade
Internamente o utilizador da classe motor pode desejar alterar a velocidade, cria-se então a função :
void altera_velocidade(int novav);


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.



Métodos ou Funções Membro

O C permite que se acrescentem funções de manipulação da struct na 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, diz - se que o objeto está a receber uma mensagem ( para executar uma ação ). Um programa simples para testes sobre funções membro seria o seguinte:

Exemplo 1:[b]
#include
struct contador //conta ocorrências 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 esquecas os parenteses, é uma funcao membro e não atributo!
cout << umcontador.num << endl;
umcontador.incrementa();
cout << umcontador.num << endl;
}


[b]
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 a 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 ganha acesso directo 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.

Exemplo 2 :
#include
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 (criação)
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

[b]Comentários:[b] A função membro move altera as coordenadas do objeto. O objeto tem as coordenadas x e y somadas com os argumentos dessa função membro. Nota 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; .

[b]Como funcionam no compilador as chamadas de funções membro:[b]
É 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.



breve parte 2 Aprendendo C - Parte 1    418230605