Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Construtores
Herana
CONSTRUTORES
Construtores
Um Construtor um tipo especial de funo pertencente a
uma classe. Ele automaticamente invocado quando um
objeto dessa classe declarado.
Construtores so usados tipicamente para inicializar
atributos da classe para valores default ou providos pelo
usurio.
Ou, tambm, para fazer o setup prvio antes de usar uma
classe (ex.: abrir um arquivo ou banco de dados).
Construtores tm regras especficas de nomenclatura:
Devem sempre ter o mesmo nome da clase (at as letras maisculas
e minsculas;
No devem retornar parmetro algum (nem mesmo void)
#ifndef DATA_H
#define DATA_H
#include <iostream>
class Data{
public:
int ano;
int mes;
int dia;
void print() {
cout << ano << "/" << mes << "/" << dia<<endl;
}
};
#endif
Construtores Construtor padro
Data(){
ano = 0;
mes = 1;
dia = 1;
}
system("pause");
return 0;
}
A sada do programa
Lista de inicializao
As duas formas de inicializao de variveis no construtor so equivalentes;
A segunda mais recomendada, principalmente quando seus atributos so objetos
com construtores padro.
Animal(){
altura = 0;
Define dois atributos... peso = 0;
E dois mtodos construtores. }
#endif
class Gato: public Animal{
public:
string nome;
Exemplo: classe derivada
Gato(){
peso = 0;
altura = 0;
nome = "";
}
void miar(void){
cout << nome << ": Miau!" << endl;
cout << nome << " pesa " << peso << " kg ";
cout << "e mede " << altura << "cm" << endl;
}
};
O output
#include <iostream>
#include "animal.h"
#include "gato.h"
int main() {
Gato g1(15.0,30.0,"Garfield");
g1.miar();
return 0;
}
Ordem de construo
Quando criamos um objeto de uma classe herdeira, este
composto de duas ou mais partes:
Parte(s) referente(s) a(s) classe(s) herdada(s) (ou classe base)
Uma parte referente a classe herdeira (ela prpria)
Assim, quando inicializamos um objeto de uma classe
herdeira (chamamos seu construtor), executado o
construtor padro classe mais acima na rvore de
herana (que no herdeira de nenhuma outra classe), que
constri esta parte da classe herdeira.
Em seguida, executa-se o construtor da classe logo abaixo
na arvore de herana.
E assim por diante at alcanar a classe que efetivamente
queramos construir.
Ordem de construo
#include <iostream> class C : public B
using namespace std; {
public:
class A
{
C()
public: {
A() cout<<"C \n";
{ }
cout<<"A \n"; };
}
};
class D : public C
class B : public A
{
{ public:
public: D()
B() {
{ cout<<"D \n";
cout<<"B \n"; }
}
};
};
Ordem de construo
#include <locale.h>
#include "inheritance_2.cpp" //Nome do arquivo onde foram criadas as classes A, B, C e D
int main()
{
setlocale (LC_ALL,"Portuguese");
cout<<"Construindo A: \n";
A oA;
cout<<"Construindo B: \n";
B oB;
cout<<"Construindo C: \n";
C oC;
cout<<"Construindo D: \n";
D oD;
return 0;
}
Cdigo do slide anterior
Objetos A, B, C e D
Selecionando o Construtor
No podermos inicializar diretamente os atributos da
classe filho herdados da classe pai na lista de
inicializao do Contrutor da classe filho.
Podemos contornar este problema de forma simples.
Trabalhando com herana, podemos especificar qual
construtor da classe pai queremos usar para criar um
objeto da classe filho.
Para fazermos isso, basta chamarmos o construtor (da classe pai) que
queremos utilizar na lista de inicializao da classe filho (que herda).
Cdigo para a criao das classes Pessoa e Estudante
#include <iostream>
#include <string>
class Pessoa
{
public:
std::string m_nome;
int m_idade;
std::string get_nome() const {return m_nome;} //Declarao e corpo da funo em uma linha
para economizar espao
int get_idade() const
{
return m_idade;
}
};
Continuao do cdigo...
Repare que Estudante herda publicamente Pessoa
Estudante(std::string nome = "", int idade = 0, std::string matricula = "", std::string periodo = "")
//Chama o construtor de pessoa para setar o valor de m_nome e m_idade
: Pessoa(nome, idade), m_matricula(matricula), m_periodo(periodo)
{
}
Chamamos o Construtor da
classe Pessoa e o inicializamos
com os valores nome e idade!!!
Funo main() para criarmos objetos das classe criadas
#include <locale.h>
#include "inheritance_1.cpp" //Nome do arquivo onde foram criadas as classes Pessoa e Estudante
int main()
{
setlocale (LC_ALL,"Portuguese");
return 0;
}
Cdigo do slide anterior
Objetos do tipo Pessoa e Estudante
Exerccio 1
Refaa a classe Fracao da aula anterior, dessa vez usando construtores. A sua classe deve receber o
valor do numerador e do denominador na construo e tambm conter um mtodo para somar fraes
corretamente. Faa uma funo main que utiliza essa classe.
Exerccio 2
Crie a classe Publicacao, que deve ter como atributos o nome e o ano de uma determinada
publicao. Faa tambm a classe Livro, que deve herdar de Publicacao, e ter os atributos gnero e
autor. Tambm crie mtodos que imprimem esses dados na tela e uma funo main que utilize essas
classes.
Exerccio 3
Crie a classe Poligono, que deve receber, na construo, o nmero de lados e o comprimento de cada
lado de um polgono regular. A rea de um polgono regular dada por:
2
=
180
4tan( )
onde o comprimento do lado do polgono e o nmero total de lados. Mtodos para clculo do
permetro e rea tambm so necessrios.
Exerccio 4
Faa a classe Prisma, que herda de Poligono, e tem um mtodo que calcula o volume do prisma. O
construtor dessa classe deve receber todas as informaes necessrias para calcular a rea e
permetro da base (que o polgono), bem como o volume, ou seja, ele deve receber todas as
informaes do construtor do Poligono, mais a altura do prisma. Lembrando que o volume de um
prisma a rea da base (o polgono), vezes a altura.
Gabarito Exerccio 1
Refaa a classe Fracao da aula anterior, dessa vez usando construtores. A sua classe deve receber o
valor do numerador e do denominador na construo e tambm conter um mtodo para somar fraes
corretamente. Faa uma funo main que utiliza essa classe.
#include <iostream>
#include "fracao.h"
// Realizar multiplicacao
fc = fa.multiplicar(fb);
cout << "A multiplicacao e: " << fc.m_numerador << "/" << fc.m_denominador << endl;
// Realizar soma
fc = fa.somar(fb);
cout << "A soma e: " << fc.m_numerador << "/" << fc.m_denominador << endl;
return 0;
}
Gabarito Exerccio 1
Refaa a classe Fracao da aula anterior, dessa vez usando construtores. A sua classe deve receber o
valor do numerador e do denominador na construo e tambm conter um mtodo para somar fraes
corretamente. Faa uma funo main que utiliza essa classe.
#ifndef FRACAO_H
#define FRACAO_H
fracao.h
class Fracao{
public:
int m_numerador;
int m_denominador;
Fracao();
Fracao(int num, int den);
#endif
#include "fracao.h"
Gabarito Exerccio 1 }
// Construtor
Fracao::Fracao(int num, int den){
m_numerador = num;
m_denominador = den;
}
#endif
Gabarito Exerccio 2
Crie a classe Publicacao, que deve ter como atributos o nome e o ano de uma determinada
publicao. Faa tambm a classe Livro, que deve herdar de Publicacao, e ter os atributos gnero e
autor. Tambm crie mtodos que imprimem esses dados na tela e uma funo main que utilize essas
classes. livro.cpp
livro.h #include<string>
#include<iostream>
#ifndef LIVRO_H
#include "publicacao.h"
#define LIVRO_H
#include "livro.h"
#include<string>
Livro::Livro(){
#include "publicacao.h"
genero = "";
autor = "";
using namespace std;
}
void Livro::print(){
void print(void);
Publicacao::print();
};
cout << " " << genero << " " << autor;
}
#endif
Gabarito Exerccio 2 #include <iostream>
#include "publicacao.h"
#include "livro.h"
int main() {
polygon.h polygon.cpp
#ifndef POLYGON_H #include<cmath>
#define POLYGON_H #include "polygon.h"
#include <iostream>
#include "polygon.h"
int main() {
Polygon p1(4,1.0);
return 0;
}
Exerccio 4
Faa a classe Prisma, que herda de Poligono, e tem um mtodo que calcula o volume do prisma. O
construtor dessa classe deve receber todas as informaes necessrias para calcular a rea e
permetro da base (que o polgono), bem como o volume, ou seja, ele deve receber todas as
informaes do construtor do Poligono, mais a altura do prisma. Lembrando que o volume de um
prisma a rea da base (o polgono), vezes a altura.
prism.h prism.cpp
#ifndef PRISM_H #include "prism.h"
#define PRISM_H
using namespace std;
#include "polygon.h"
Prism::Prism(){
class Prism: public Polygon{
height = 1.0;
public:
}
double height;
Prism::Prism(int ns, double ls, double h):
Prism(); Polygon(ns,ls), height(h){
Prism(int ns, double ls,double h); }