AULA 8 - Programação II - Graduação
OBJETOS E FUNÇÕES
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.
Exemplo:
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 = x^2), a exponencial (y = e^x) 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);
... }