AULA 8 - Programação II - Graduação

De IFSC
Revisão de 11h11min de 14 de março de 2018 por imported>Fargoud (Criou página com 'OBSERVAÇÕES SOBRE CLASSES: O modo de acesso default é o private (se o especificador de acesso for omitido). Os dados privados podem ser alterados por funções externas à...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

OBSERVAÇÕES SOBRE CLASSES: O modo de acesso default é o private (se o especificador de acesso for omitido). Os dados privados podem ser alterados por funções externas à classe chamadas funções friend. Se o objeto for criado como estático (Ex: static Horario HoraEstat; ) e possuir um Destrutor, este só será chamado com o término da execução do programa. Cuidado para não permitir acesso indireto a membros privados - por referência!  viola o encapsulamento!

Exemplo:

class Horario { public: ... int & SetaHoraRuim(int, int, int); ... private: int hora, minuto, segundo; // atributos privados };

...

int & Horario::SetaHoraRuim(int h) { hora = (h >= 0 && h < 24)? h:0; return hora; // envia endereço de hora pra código cliente }


Todo o conteúdo de um objeto pode ser atribuído a outro de mesmo tipo, através do operador “=“  cópia membro-a-membro. Ex: class Data{ ... public: Data (int=1,int=1,int=2000); //construtor default ... }; ... Data data1(7,4,2001), data2; // cria dois objetos ... data2 = data1; // cópia dos atributos de data1 para data2 ...

EXERCÍCIO: Implemente uma calculadora científica, que além das 4 operações é capaz de calcular e plotar as curvas: parabolóide (y = x2), a exponencial (y = ex) e a senoidal (y = sen x). Declare a classe Calculadora, com todos os seus atributos, coeficientes e métodos de cálculo e crie um código cliente que utilizará uma instância desta classe. DICA: para traçar os gráficos de saída você pode utilizar um componente TImage e as propriedades/métodos de Canvas, ou um componente pronto de gráficos da VCL do C++ Builder (como TChart).

OBJETOS CONSTANTES: O Objeto declarado com o modificador const não pode ter nenhum de seus atributos iniciais modificados. Ex: const Data Natal(25,12,2003); Isto causa um problema: compilador nega-se a acessar também os métodos - para não alterar atributos do objeto. Para informar ao compilador que um método não altera atributos do objeto constante (e que pode ser, portanto, acessado): colocar o modificador const após os parênteses da função, no protótipo e no corpo do método! Ex: ... public: int bissexto( ) const { return (ano%4==0&&ano%100||ano%400==0; }

OBJETOS COMO ARGUMENTOS: Objetos podem ser argumentos de funções e mesmo de funções-membro da própria classe a que pertencem. Ex: #include <iostream.h> class Venda { private: int Npecas; float Preco; public:Venda() { } Venda(int np, float p) { Npecas = np; Preco = p; } void PegaVenda() { cout << “Insira no. de peças: “; cin >>Npecas; cout << “Insira preço: “; cin>>Preco; } void AdicionaVenda(Venda v1, Venda v2) { Npecas = v1.Npecas + v2.Npecas; Preco = v1.Preco + v2.Preco; } void ImprimeVenda( ) const; };

Exemplo de saída:

void main( ) { Venda A(58,12734.53), B, Total;


B.PegaVenda( ); Total.AdicionaVenda(A,B);

cout << “Venda A .......... “; A.ImprimeVenda( ); cout << “Venda B ...........”; B.ImprimeVenda( ); cout << “TOTAL: ..........”; Total.ImprimeVenda( );

}

FUNÇÕES RETORNANDO OBJETOS: No exemplo anterior, poderíamos modificar o método AdicionaVenda( ) para que este retornasse um objeto à main(), ao invés de modificar os atributos (e aí torna-se const também!). Ex: ... Venda AdicionaVenda(Venda v) const { Venda Aux; Aux.Npecas = Npecas + v.Npecas; Aux.Preco = Preco + v.Preco; return Aux; } ... void main( ) { Venda A(58,12734.53), B, Total; B.PegaVenda( ); Total = A.AdicionaVenda(B); ... }