C++ - Classes e Objetos Classe : Tipo que combina os dados e as funções para operá-los. Objeto : variável de uma classe. Partes dados-membro ou variáveis de instância funções-membro ou métodos Definição : Através de um exemplo de classe para conter os dados de um retângulo, calcular e imprimir sua área. class Retangulo // definição da classe private : int bas, alt; // dados-membro // funções-membro void init(int b, int h) // inicializa os dados bas = b; alt = h; void printdata( ) // imprime a área cout << \nbase = << bas; cout << \naltura = << alt; cout << \narea = << (bas*alt); ; void main( ) Retangulo x; // declaração do objeto x.init(5,3); /*chama função-membro que inicializa x.printdata( ); os dados (envio de mensagem) */ /* chama função-membro que imprime a área do retângulo */ Observ. : Neste exemplo, as funções-membro tem código definido dentro da classe e são criadas como inline por default. Funções-membro definidas fora da classe : o protótipo deve estar presente no corpo da definição da classe. Ex.: #include <iostream.h> class data
private : int dia, mes, ano; int bissexto( ) // função inline return (ano%4==0 && ano%100 ano%400==0); void initdata(int d, int m, int a); // introduz dados void printdata( ); // imprime por extenso void printsigno( ); // imprime signo void print bissexto( ); // imprime bissexto ; void data :: initdata( int d, int m, int a) int dmes[ ] = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; ano = a>0? a : 0; dmes[2] = dmes[2] + bissexto( ); mês = m >=1 && m <=12? m : 0; dia = d >=1 && d <= dmes[mês]? d : 0; void data :: printdata( ) char nome [13][10] = zero, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro ; cout << \n\n <<dia<< de <<nome[mes]<< de <<ano; void data :: printsigno( ) char nsigno[14][12] = zero, Capricórnio, Aquário, Peixes, Aires, Touro, Gêmeos, Câncer, Leão, Virgem, Libra, Escorpião, Sagitário, Capricórnio ; int sig[ ] = 0, 20, 19, 20, 20, 20, 20, 21, 22, 22, 22, 21, 21; if (dia < sig[mes]) cout << \nsigno : << nsigno[mes];
else cout << \nsigno : << nsigno[mes + 1]; void data :: printbissexto( ) if (bissexto( ) ) else cout << \nano bissexto ; cout << \nano não bissexto ; void main( ) data x, y; // declaração dos objetos x.initdata(13, 5, 1999); // introdução de dados y.initdata(25, 12, 2000); x.printdata( ); x.printsigno( ); x.printbissexto( ) //impressão y.printdata( ); y.printsigno( ); y.printbissexto( ) Observ. : Na definição da função-membro fora da classe, o nome da função é precedido pelo nome da classe e pelo símbolo :: (operador de resolução de escopo). Construtor : É uma função-membro que tem o mesmo nome da classe e é executada automaticamente toda vez que um objeto é criado. Ex.: class data data (int d, int m, int a); data :: data (int d, int m, int a) initdata(d, m, a); // Construtor // Sem tipo
data x(13, 5, 1999), y(25, 12, 2000); /* inicialização dos objetos */ Sobrecarga de construtores : class data data (int d, int m, int a); data ( ); // Construtor // Cosnstutor sobrecarregado data :: data ( ) int d, m, a; cout << \ndia : ; cin >> d; cout << \nmes : ; cin >> m; cout << \nano : ; cin >> a; initdata(d, m, a); data x(13, 5, 1999), y ; /* inicialização dos objetos */ Observ. : Na criação do objeto x, será chamado o construtor com argumentos; na criação do objeto y, o construtor sem argumentos. Objetos const : Os membros de dados não podem ser alterados. Ex.: const data natal (25, 12, 1999);
Quando um objeto constante é declarado, o compilador proíbe a ele o acesso a qualquer função-membro, pois não consegue identificar quais funções-membro alteram os seus dados. A palavra const após os parênteses que envolvem a lista de parâmetros da função, indica que a função não modifica o objeto. Desta forma, é possível acessála. Assim a classe data fica: class data private : int dia, mes, ano; int bissexto( ) const return (ano%4==0 && ano%100 ano%400==0); void initdata(int d, int m, int a); void printdata( ) const; void printsigno( ) const; void print bissexto( ) const; ; void data :: printdata( ) const char nome [13][10] = Observ. : É importante declarar nossas funções-membro const sempre que possível. Isto permitirá ao programador utilizar a classe para declarar objetos constantes. Objetos como argumentos de funções-membro : Exemplo : #include <iostream.h> #include <iomanip.h> class venda private : int npecas; float preco; venda ( ) /* construtor sem argumentos e de
corpo vazio (cria objetos sem inicializar) */ venda (int np, float p) // construtor com argumentos npecas = np; preco = p; void getvenda ( ) cout << \nnumero de pecas : ; cin >> npecas; cout << \npreco : ; cin >> preco; void printvenda( ) const; ; void add_venda( venda v1, venda v2) // objeto como arg. npecas = v1.npecas + v2.npecas; preco = v1.preco + v2.preco; void venda :: printvenda( ) cout << setiosflags (ios :: fixed) // não notação científica << setiosflags (ios :: showpoint) // ponto decimal << setprecision (2) // duas casas decimais << setw(10) << npecas; // campo tamanho 10 cout << setw(10) << preco << \n ; venda A(58, 12734.53), B, Total; B.getvenda( ); Total.add_venda(A, B); cout << Venda A.. ; A.printvenda( ); cout << Venda B.. ; B.printvenda( ); cout << Totais.. ; Total.printvenda( ); Observ. : Quando uma função membro é chamada, ela só tem acesso aos dados de um único objeto : o objeto do qual a função é membro. Por isso, para a função
add_venda( ) acessar os membros dos objetos passados como argumento foi necessário o uso do operador ponto ( v1. Pecas, v1.preco). Função que retorna um objeto : Função add_venda( ) modificada class venda venda add_venda (venda v) const; // retorna objeto venda venda :: add_venda(venda v) const venda temp; // variável temporária temp.npecas = npecas + v.npecas; temp.preco = preco + v.preco; return temp; venda A(58, 12734.53), B, Total; B.getvenda( ); Total = A.add_venda( B ); // Total = A + B Dados-membro static : quando um dado-membro é declarado static, é criado um único item para classe como um todo, não importando o número de objetos declarados. A informação de um membro static é compartilhada por todos os objetos da mesma classe. Ex.: Conta objetos criados #include <iostream.h> class Rec private :
; static int n; // dado-membro static Rec ( ) n++; // construtor int getrec( ) const return n; Rec r1, r2, r3; cout << \nnumero de objetos : << r1.getrec( ); cout << \nnumero de objetos : << r2.getrec( ); cout << \nnumero de objetos : << r3.getrec( ); Troque static int n; por int n; e execute novamente. Destrutor : Tem o mesmo nome da classe precedido de um til ~ e é chamado automaticamente toda vez que um objeto é destruído. O destrutor não tem valor de retorno, não pode receber argumentos e nem pode ser chamado explicitamente pelo programador. Ex.: class Rec private : static int n; // dado-membro static Rec ( ) n++; // construtor ~Rec ( ) n // destrutor int getrec( ) const return n; ; void main( ) Rec r1, r2, r3; cout << \nnumero de objetos : << r1.getrec( ); Rec r4, r5; cout << \nnumero de objetos : << r1.getrec( ); cout << \nnumero de objetos : << r1.getrec( ); Membros static públicos : Pode ser acessado em main( ). Ex.:
class moeda private : float RS; public: static float US; // membro static público moeda (float x) RS = x; moeda ( ) cout << \ndigite R$ : ; cin >> RS; float usdolar ( ) return RS/US; ; moeda a(5345.43), b; a.us = 1.60; // acesso a membro static público cout << \nvalor em US$ de a : << a.usdolar ( ); cout << \nvalor em US$ de b : << b.usdolar ( ); outra sintaxe : ; moeda :: US = 1.60; // usando o nome da classe Observ. : Um membro static é criado na definição da classe e existe independente de qualquer objeto. Não pode ser inicializado por um construtor, visto que o construtor é chamado toda vez que um objeto é criado. Funções-membro static : São utilizadas para implementar recursos comuns a todos os objetos. Agem independentemente de qualquer objeto declarado e acessam somente membros static da classe. Ex.: class moeda private : static float US; public: ; ; static float usvalor ( ) // função-membro static cout << \ndigite o valor do dólar : ; cin >> US;
moeda :: usvalor ( ); // chamada em main ( ) Estruturas e Classes : Diferença : os membros de uma classe são privados por default e os de uma estrutura são públicos por default. Observe : class facil equivale class facil private: // sem private int n; int n; void func ( ); void func ( ); ; ; equivale struct facil void func ( ); // membros públicos antes private : int n; ; Matrizes de objetos : Ex.: matriz de objetos venda const MAX = 100; // Número máximo de objetos venda A[MAX]; A[i]. getvenda( ) ; // matriz de objetos /* acesso a função-membro via elemento da matriz */ Inicialização da matriz : através de chamada ao construtor (explícita ou implícita) venda A[MAX] = ; venda (50, 123.50), venda ( ), venda (15, 38.40)
( construtor sem argumentos chamado explicitamente para o segundo elemento e implicitamente para o quarto elemento em diante). Criando um tipo string : Resolvendo o problema de atribuição de uma string a outra (str1 = str2). Criação da classe string. #include <iostream.h> #include <string.h> const MAX = 80; class string private : char str[max]; string( ) str[0] = \0 ; // construtor string vazio string ( char s[ ]) strcpy(str, s); // construtor string ( char ch, int n); // outro construtor int len ( ) const return strlen (str); void print ( ) const cout << str; ; string :: string (char ch, int n) for (int i=0; i<n; i++) str[i] = ch; str[i]= \0 ; string s1( Feliz Aniversário! ), /* forma alternativa : string s1 = Feliz Aniversário! */ s2( =, 18), s3, s4; cout << \ns1 = ; s1.print( ); cout << \ns2 = ; s2.print( ); s3 = Parabéns!! ; cout << \ns3 = ; s3.print( );
s4 = s3; // objeto atribuído a outro cout << \ns4 = ; s4.print( ); Objetos e a alocação de memória : para cada objeto declarado, é reservado espaço um espaço de memória em separado para armazenamento de seus dadosmembro. Entretanto, funções-membro são criadas e colocadas na memória somente uma vez para a classe toda. Exercícios Assunto : Classes e Objetos 1) Crie uma classe para descrever restaurantes. Os membros devem armazenar o nome, o endereço, o preço médio e o tipo de comida. Crie um construtor que inicialize os dados com zero e outro com um valor fixo. Crie uma função membro para solicitar os dados para o usuário, e outra para imprimir os dados de um restaurante. Escreva um programa que crie uma matriz de objetos restaurante e solicite a entrada dos dados pelo usuário. Em seguida o programa pergunta o tipo de comida ao usuário e lista todos os restaurantes que o oferecem. 2) Defina uma classe de nome aluno com dados privados para armazenar o nome do aluno, a matrícula e o curso. Inclua duas funções públicas: uma para solicitar os dados ao usuário, outra para imprimir os dados. Inclua um membro static privado para contar o número de alunos cadastrados, um construtor que incremente o contador de alunos e um destrutor que decremente. Inclua também uma função pública que retorne o número de alunos cadastrados. Escreva um programa que cadastre alunos e imprima o cadastro. 3) Escreva uma classe para descrever um mês do ano. A classe deve ser capaz de armazenar o nome do mês, a abreviação em três letras, o número de dias e o número do mês. Crie um construtor para inicializar os dados com zero e outro com um valor fixo. Escreva uma função-membro que receba o número do mês como argumento e retorne o total de dias do ano até aquele mês. Escreva outra função membro sobrecarregada que receba o nome do mês como argumento e retorne o mesmo total de dias. Prática VI Escreva uma classe para conter três membros do tipo int chamados hora, mins e segs e chame-a de tempo.
a) Crie um construtor que inicialize os dados com zero e outro com um valor fixo. b) Crie uma função-membro para solicitar a hora, os minutos e os segundos para o usuário. c) Crie uma função membro para imprimir a hora no formato hh:mm:ss d) Crie uma função membro para adicionar dois objetos da classe tempo passados como argumentos. e) Crie uma função membro que subtraia duas horas e retorne o número de segundos entre elas. A função recebe dois objetos da classe tempo passados como argumentos. Escreva uma classe que represente um estacionamento. Ela deve armazenar o número da chapa do carro, a marca, a hora de entrada e a hora de saída. Utilize dois membros da classe tempo para hora de entrada e saída. a) Crie uma função membro para solicitar os dados de uma carro para o usuário (utilize as funções da classe tempo para pedir a hora de entrada e saída) b) Crie uma função-membro para imprimir os dados de um carro. c) Admita que o estacionamento cobre R$1,00 a hora. Escreva uma funçãomembro que imprima o valor cobrado. Utilize a função que subtrai duas horas da classe tempo. Escreva um programa que crie uma matriz de objetos da classe anterior, solicite os dados dos carros para o usuário e imprima um relatório dos dados e do valor cobrado.