- Entrou
- Set 23, 2006
- Mensagens
- 1,690
- Gostos Recebidos
- 0
Nesta secção falarei dos aspectos mais básicos de uma classe, aqueles que todos devem saber para fazer um melhor uso das classes. Para variar, não há nada melhor do que um exemplo. Irei desenvolver uma classe Ponto que, por acaso, até costuma ser muito usada pelos programadores gráficos.
Os, muitos dos métodos não têm código nenhum associado... Todos os que têm estão definidos inline, ou seja, por cada objecto criado esse código será "anexado" a essa instância. Este é um bom método para pouco código, mas se fosse uma função muito grande, não dava nada jeito estar a inclui-la inline, e o executável ficaria com um tamanho enorme. Outra maneira é definir os métodos num cpp.
Desta maneira essas funções estarão num sitio da memória e cada objecto criado utilizará as mesmas funções.
Outra novidade é a maneira como inicializei os atributos no construtor, de facto o que fiz tem o mesmo efeito prático que fazer Ponto( ..... ) { x=x; y=y; }
A definição dos métodos levaria muito espaço e eu sinceramente não tenho paciência para o passar aqui... até porque pelas estatísticas vê-se que a malta prefere tirar logo os exemplos do que estar a ler aquilo que eu tão de boa vontade escrevo.
Por isso, no exemplo está tudo, devidamente comentado e explicado, e com um programa de exemplo.
É claro que não ficou tudo o que havia a dizer sobre classes, mas já ficou um cheirinho... Com o tempo e com a prática é que se aprende.
Mais um àparte, esta classe poderia ser tratada como uma estrutura, visto que todos os seus atributos e métodos são publicos. E essa é a principal diferença entre struct e class. Nas estruturas tudo é público por defeito, nas classes tudo é privado por defeito.
Ok, acabei de deixar aqui muita matéria, eu compreendo. Mas por um lado é bom para quem está a aprender tentar descobrir como se fazem as coisas sozinho, experimentar esta classe será muito bom para a sua aprendizagem...#ifndef _TUT_PONTO_H_
#define _TUT_PONTO_H_
// para leitura e escrita
#include <iostream>
using namespace std;
class Ponto {
/* por defeito os atributos/métodos de uma classe são sempre privados
por isso não é necessário por aqui private: */
public: // mEtodos publicos
// atributos do ponto, tambEm se poderia adicionar a cor
// mas como nAo irei mexer em grafismo, não vale a pena
int x, y;
// construtor
Ponto( const int &_x = 0, const int &_y = 0 ): x(_x), y(_y) { }
// construtor por copia
Ponto& Ponto( const Ponto & p );
// destrutor
~Ponto() { /* não há nada para ser feito */ }
// afetar um Ponto com outro
Ponto& operator= ( const Ponto &p );
// somar dois pontos
Ponto operator+ ( const Ponto &p );
Ponto operator+= ( const Ponto &p );
// subtrair...
Ponto operator- ( const Ponto &p );
Ponto operator-= ( const Ponto &p );
// operadores de incremento e decremento
Ponto& operator++ (); // ex: Ponto a; ++a;
Ponto& operator++ (int); // ex: Ponto a; a++;
Ponto& operator-- (); // ex: Ponto a; --a;
Ponto& operator-- (int); // ex: Ponto a; a--;
// operadores relacionais lógicos
bool operator== ( const Ponto &p );
bool operator!= ( const Ponto &p );
bool operator>= ( const Ponto &p );
bool operator<= ( const Ponto &p );
bool operator> ( const Ponto &p );
bool operator< ( const Ponto &p );
}; // nunca esquecer deste ;
// funções globais de escrita e leitura
ostream& operator << ( ostream& os, const Ponto &p ); // para fazer Ponto _k; cout<<_k;
istream& operator >> ( istream& is, const Ponto &p ); // para fazer Ponto a; cin>>a;
#endif // _TUT_PONTO_H_
Os, muitos dos métodos não têm código nenhum associado... Todos os que têm estão definidos inline, ou seja, por cada objecto criado esse código será "anexado" a essa instância. Este é um bom método para pouco código, mas se fosse uma função muito grande, não dava nada jeito estar a inclui-la inline, e o executável ficaria com um tamanho enorme. Outra maneira é definir os métodos num cpp.
Desta maneira essas funções estarão num sitio da memória e cada objecto criado utilizará as mesmas funções.
Outra novidade é a maneira como inicializei os atributos no construtor, de facto o que fiz tem o mesmo efeito prático que fazer Ponto( ..... ) { x=x; y=y; }
A definição dos métodos levaria muito espaço e eu sinceramente não tenho paciência para o passar aqui... até porque pelas estatísticas vê-se que a malta prefere tirar logo os exemplos do que estar a ler aquilo que eu tão de boa vontade escrevo.
Por isso, no exemplo está tudo, devidamente comentado e explicado, e com um programa de exemplo.
É claro que não ficou tudo o que havia a dizer sobre classes, mas já ficou um cheirinho... Com o tempo e com a prática é que se aprende.
Mais um àparte, esta classe poderia ser tratada como uma estrutura, visto que todos os seus atributos e métodos são publicos. E essa é a principal diferença entre struct e class. Nas estruturas tudo é público por defeito, nas classes tudo é privado por defeito.