====== Programas em C++ da apostila ====== ===== 3.1.2.6. Construtores e Agregação ===== reta(float x1,float y1,float x2,float y2): p1(x1,y1),p2(x2,y2) { //nada mais a fazer, os construtores de p1 e p2 ja //foram chamados } reta(float x1,float y1,float x2,float y2): p1(x1,y1),p2(x2,y2), identificacao(10) { //nada mais a fazer, os construtores de p1 e p2 ja //foram chamados } reta (float x1,float y1,float x2,float y2): p1(x1,y1),p2(x2,y2) { identificacao=10; //também pode, porque tipos básicos (int) em C++ não //são objetos, portanto não têm construtores } #include struct ponto { float x; float y; //coordenadas ponto(float a,float b) { x=a; y=b; } //construtor void move(float dx,float dy) { x+=dx; y+=dy; } //funcao membro comum void inicializa(float a,float b) { x=a; y=b; } void mostra(void) {cout << "X:" << x << " , Y:" << y << endl;} }; struct reta { ponto p1; ponto p2; reta(float x1,float y1,float x2,float y2):p1(x1,y1),p2(x2,y2) { //nada mais a fazer, os contrutores de p1 e p2 ja //foram chamados } void mostra(void); }; void reta::mostra(void) { p1.mostra(); p2.mostra(); } void main() { reta r1(1.0,1.0,10.0,10.0); //instanciacao da reta r1 r1.mostra(); } ===== 3.1.2.7. Destrutores ===== //destrutor de uma classe #include struct contador{ int num; contador(int n) {num=n;} //construtor void incrementa(void) {num+=1;} //funcao membro comum, pode ser chamada pelo usuario ~contador(void) {cout << "Contador destruido, valor:" << num < ===== 3.1.3 Encapsulamento com Class ===== ==== Declaração 1 ==== class ponto { float x; //dados membro float y; public: //qualificador void inicializa(float a, float b) {x=a; y=b;}; //funcao membro void move(float dx, float dy) {x+=dx; y+=dy; }; }; ==== Declaração 2 ==== class ponto { private: float x; float y; public: //qualificador void inicializa(float a, float b) {x=a; y=b;}; void move(float dx, float dy) {x+=dx;y+=dy; }; }; ==== Declaração 3 ==== struct ponto { private: //se eu nao colocar private eu perco o encapsulamento //em struct. float x; float y; public: //qualificador void inicializa(float a, float b) {x=a;y=b;}; void move(float dx, float dy) {x+=dx; y+=dy;}; }; ===== 3.1.3.1. Atributos Private, Funções Membro Public ===== #include class ponto { private: //nao precisaria por private, em class e default float x; //sao ocultos por default float y; //sao ocultos por default public: //daqui em diante tudo e acessivel. void inicializa(float a,float b) { x=a; y=b; } //as funcoes de uma classe podem acessar os atributos //private dela mesma. void mostra(void) {cout << "X:" << x << " , Y:" << y << endl;} }; void main() { ponto ap; //instanciacao ap.inicializa(0.0,0.0); //metodos public ap.mostra(); //metodos public } ===== 3.1.3.2. Um Dado Membro é Public ===== #include class ponto { float x; //sao ocultos por default public: //daqui em diante tudo e acessivel. ponto(float a,float b); //construtor tambem pode ser inline ou nao void mostra(void); void move(float dx,float dy); float y; //* Y nao e' mais ocultado }; ponto::ponto(float a,float b) { x=a; y=b; } void ponto::mostra(void) { cout << "X:" << x << " , Y:" << y << endl; } void ponto::move(float dx,float dy) { x+=dx; y+=dy; } void main() { ponto ap(0.0,0.0); ap.mostra(); ap.move(1.0,1.0); ap.mostra(); ap.y=100.0; ap.mostra(); } ===== 3.1.3.3. Compilando um Programa com Vários Arquivos ===== //Arquivo 1 ponto.h, definicao para a classe ponto. class ponto { public: //daqui em diante tudo e acessivel. void inicializa(float a,float b); void mostra(void); private: float x; //sao ocultos por default float y; //sao ocultos por default }; //Arquivo 2 , ponto.cpp , implementacao para a classe //ponto. #include #include "ponto.h" void ponto::inicializa(float a,float b) { x=a; y=b; } //as funcoes de uma classe podem acessar os atributos //private dela mesma. void ponto::mostra(void) {cout << "X:" << x << " , Y:" << y << endl;} //Arquivo 3 . Programa principal: princ.cpp #include "ponto.h" void main() { ponto ap; //instanciacao ap.inicializa(0.0,0.0); //metodos public ap.mostra(); //metodos public } //header file para o TAD fracao. //File easyfra.h long mdc(long n,long d); //maximo divisor comum metodo de Euclides. class fracao { private: long num; //numerador long den; //denominador public: fracao(long t,long m); //construtor comum void simplifica(void); //divisao pelo mdc ~fracao() { /* nao faz nada*/ } //Nao e preciso fazer nada. //operacoes matematicas basicas fracao soma (fracao j); fracao multiplicacao(fracao j); //operacoes de comparacao int igual(fracao t); int diferente(fracao t); int maiorouigual(fracao t); //operacoes de input output void mostra(void); //exibe fracao no video void cria(void); //pergunta ao usuario o valor da fracao //operacoes de conversao de tipos double convertedbl(void); //converte para double long convertelng(void); //converte para long }; //implementacao para a classe fracao. #include #include "easyfra.h" long mdc(long n,long d) //maximo divisor comum //metodo de Euclides +- 300 anos AC. { if (n<0) n=-n; if (d<0) d=-d; while (d!=0) { long r=n % d; //%=MOD=Resto da divisao inteira. n=d; d=r; } return n; } void fracao::simplifica(void) { long commd; commd=mdc(num,den); //divisor comum num=num/commd; den=den/commd; if (den<0) { den=-den; num=-num;}; //move sinal para cima } fracao::fracao(long t,long m) { num=(t); den=(m); simplifica(); //chamada para o mesmo objeto. } fracao fracao::soma(fracao j) { fracao g((num*j.den)+(j.num*den),den*j.den); return g; } fracao fracao::multiplicacao(fracao j) { fracao g(num*j.num,den*j.den); return g; } int fracao::igual(fracao t) { return ((num*t.den)==(den*t.num)); //funciona bem mesmo para nao simplificada } int fracao::diferente(fracao t) { return ((num*t.den)!=(den*t.num)); } int fracao::maiorouigual(fracao t) { return ((num*t.den)>=(t.num*den)); } void fracao::mostra(void) { cout << "(" << num << "/" << den << ")"; } void fracao::cria(void) { cout << "Numerador:"; cin >> num; cout << "Denominador:"; cin >> den; simplifica(); } double fracao::convertedbl(void) { double dbl; dbl=(double(num)/double(den)); return dbl; } //conversao para long long fracao::convertelng(void) { long lng; lng=num/den; return lng; } #include #include "easyfra.h" //nossa definicao da classe #include int main() { fracao a(0,1),b(0,1); cout << " Entre com fracao a: "; a.cria(); a.mostra(); cout << " Entre com fracao b: "; b.cria(); b.mostra(); fracao c(a.soma(b)); //c(a+b) cout << endl << "c de a+b:"; c.mostra(); cout << endl << "a*b"; c=a.multiplicacao(b); c.mostra(); cout << endl << "a+b"; c=a.soma(b); c.mostra(); cout << endl << "a>=b"; cout << a.maiorouigual(b); cout << endl << "a==b"; cout << a.igual(b); cout << endl << "a!=b"; cout << a.diferente(b); cout << endl << "long(a) "; cout << a.convertelng(); cout << endl << "double(a) "; cout << a.convertedbl(); return 0; }