fundamentos de programaçãodanielc/ensino/graduacao... · 2016-03-28 · fundamentos de...
TRANSCRIPT
![Page 1: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/1.jpg)
1/29
Fundamentos de ProgramaçãoOrientada a Objetos
Classes e instâncias. Construtores, destrutores e operador de atribuição de cópia. Objetos, atributos, operações: mensagens e métodos, estados. Encapsulamento, ocultamento. Lista de exercícios.
Aula 5Prof. Daniel Cavalcanti Jeronymo
Universidade Tecnológica Federal do Paraná (UTFPR)Engenharia Eletrônica – 3º Período2016.1
ET43I
![Page 2: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/2.jpg)
2/29
Plano de Aula
• Classes
• Encapsulamento
• Construtores e destrutores
• Idiomas do C++
![Page 3: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/3.jpg)
3/29
Classes
• Programação Orientada a Objetos (POO)
• Objetos possuem:
• Dados (atributos)
• Comportamento (métodos)
• Classes definem o modelo de um objeto
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 4: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/4.jpg)
4/29
Classes
• Classes
• São tipos definidos pelo usuário
• Palavra reservada class
• Corpo delimitado por chaves
• Declaração terminada com ponto-e-vírgula
class nomeDaClasse{
...
...
...};
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 5: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/5.jpg)
5/29
Classes
• Class vs Struct
• Ambos são tipos definidos pelo usuário e são estruturas de dados
• Encapsulamento padrão:
• Classes – private
• Structs – public
class nomeDaClasse{
...
...
...};
struct nomeDaStruct{
...
...
...};
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 6: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/6.jpg)
6/29
Classes
• Classes
• Modificadores de acesso especificam o nível de acesso (ouocultamento) aos membros da classe
class nomeDaClasse{
public:int membroPublico;
private:int membroPrivado;
protected:int membroProtegido;
};
Lembrete de Prog. 1:Modificadores de acesso são uma evolução da linguagem para permitir a construção de tipos/ponteiros opacos(e.g., FILE* em C)
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 7: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/7.jpg)
7/29
Classes
• Classes
• Public
• Membros podem ser acessados externamente e internamente
• Private
• Membros podem ser acessados internamente na classe
• Protected
• Membros podem ser acessados internamente na classee por classes derivadas (heranças)
Ao contrário de no objeto!
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 8: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/8.jpg)
8/29
Classes
• Classes – Exemplo
#include <iostream>using namespace std;class minhaClasse{public:
int membroPublico;int acessaPrivado() { return membroPrivado; }void escrevePrivado(int valor) { membroPrivado = valor; }
private:int membroPrivado;
};
int main(){
minhaClasse teste;teste.membroPublico = 10; // OK!cout << teste.membroPublico << endl; // OK!//teste.membroPrivado = 100; // ERRO!teste.escrevePrivado(100); // OK!cout << teste.acessaPrivado() << endl; // OK!
return 0;}
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 9: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/9.jpg)
9/29
Classes
• Classes
• Métodos podem ser definidos dentro da classe ou fora
class nomeDaClasse{
tipoRetorno nomeDaFuncao() { ... }};
class nomeDaClasse{tipoRetorno nomeDaFuncao();
};
tipoRetorno nomeDaClasse::nomeDaFuncao(){
...}
declaração e definição
declaração
definição
Lembrete de Prog. 1:Declaração: introduz um identificador e seu tipo (necessidade do compilador)Definição: implementa um identificador (necessidade do linker)
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 10: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/10.jpg)
10/29
Classes
• Classes – Exemplo (definições pelo operador de escopo)
class minhaClasse{public:
int membroPublico;
int acessaPrivado();void escrevePrivado(int valor);
private:int membroPrivado;
};
int minhaClasse::acessaPrivado(){
return membroPrivado;}
void minhaClasse::escrevePrivado(int valor){
membroPrivado = valor;}
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 11: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/11.jpg)
11/29
Classes
• Classes – Ponteiro this
• A instância é uma cópia única de uma classe e representaum objeto
• Cada instância tem seu próprio endereço
• Ponteiro this
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 12: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/12.jpg)
12/29
Classes
• Classes – Ponteiro this
• This é um ponteiro interno para o próprio objeto
• O ponteiro é passado como um argumento oculto para todas as funções não estáticas de uma classe
• Disponível como uma variável local dentro do corpo da função:
minhaClasse * const this;
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 13: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/13.jpg)
13/29
Classes
• Classes – Exemplo ponteiro this#include <iostream>using namespace std;
class minhaClasse{private:
int algo;public:
void mudaAlgo(int algo) { this->algo = algo; }minhaClasse * const meuponteiro() { return this; }
};
int main(){
minhaClasse mc;
cout << "Endereco do objeto: " << &mc << endl;cout << "Endereco do ponteiro this: " << mc.meuponteiro() << endl;cout << "Tamanho do objeto: " << sizeof(mc) << endl;
return 0;}
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 14: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/14.jpg)
14/29
Classes
• Classes – Exemplo ponteiro this
• A chamada:
• Na verdade é:
mc.mudaAlgo(10);
mudaAlgo(&mc, 10);
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 15: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/15.jpg)
15/29
Classes
• Classes
• Objetos são criados e destruídos
{...minhaClasse obj;...
}
minhaClasse *obj = new minhaClasse;...delete obj;
pilha heap
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 16: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/16.jpg)
16/29
Classes
• Classes
• Construtores são funções que são chamadas nacriação de um objeto
• Destrutores são funções que são chamadas nadestruição de um objeto
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 17: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/17.jpg)
17/29
Classes
• Classes
• Construtores
• Nome da função é igual ao nome da classe, a funçãorecebe parâmetros e não tem valor de retorno
• Pode ser sobrecarregado
• Usando a definição ao lado, é possível criar um objetominhaClasse sem parâmetros?
class minhaClasse{public:
int algo;minhaClasse(int valor){
algo = valor;}
};
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 18: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/18.jpg)
18/29
Classes
• Classes
• Destrutores
• Nome da função é igual ao nome da classe com um til no início (~), a função não recebe parâmetros e nãotem valor de retorno
• Não pode ser sobrecarregado
• Uso típico: liberar recursos (.e.g, desalocar memória de uso interno aoobjeto)
class minhaClasse{public:
int algo;minhaClasse(int valor){
algo = valor;cout << valor << endl;
}~minhaClasse(){
cout << algo << endl;}
};
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 19: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/19.jpg)
19/29
Classes
• Classes
• O compilador cria implicitamente construtor e destrutorpadrões caso estes sejam omitidos
• Os padrões implícitos são equivalentes aos explícitos com corpo vazio
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 20: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/20.jpg)
20/29
Classes
• Classes
• Construtor de cópia
• Construtor especial invocado ao criar um objeto a partir de outro do mesmo tipo
• Caso omitido, é criado automaticamente pelo compilador e realiza uma cópia membro a membro (memberwise) do objeto
minhaClasse m1(mc);
minhaClasse m2 = mc;
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 21: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/21.jpg)
21/29
Classes
• Classes
• Construtor de cópia
• bitwise vs memberwise
• shallow copy vs deep copy
ISO/IEC 14882:1998 Programming languages — C++
The implicitly defined copy constructor for class X performs a memberwise copy of its subobjects. The order of copying is the same as the order of initialization of bases and members in a userdefined constructor (see 12.6.2).Each subobject is copied in the manner appropriate to its type:— if the subobject is of class type, the copy constructor for the class is used;— if the subobject is an array, each element is copied, in the manner appropriate to the element type;— if the subobject is of scalar type, the builtin assignment operator is used.
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 22: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/22.jpg)
22/29
Classes
• Classes
• Construtor de cópia
• Chamado em 3 situações:
• Quando fazemos uma cópia de um objeto
• Quando passamos um objeto por valor para uma função
• Quando retornamos um objeto por valor de uma função
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 23: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/23.jpg)
23/29
Classes
• Classes
• Sobrecarregando o construtor de cópia
class minhaClasse{public:
int algo;minhaClasse(int valor){
algo = valor;cout << valor << endl;
}minhaClasse(const minhaClasse & outro){
this->algo = outro.algo;cout << algo << endl;
}~minhaClasse(){
cout << algo << endl;}
};
int main(){
minhaClasse mc(20);
minhaClasse m1(mc);
minhaClasse m2 = mc;
cout << "fim" << endl;
return 0;}
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 24: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/24.jpg)
24/29
Classes
• Classes
• Construtor de cópia vs operador de cópia
minhaClasse first; // inicialização pelo construtor padrãominhaClasse second(first); // inicialização pelo construtor de cópiaminhaClasse third = first; // inicialização pelo construtor de cópiasecond = third; // atribuição pelo operador de atribuição de cópia
OBS: pelo código apresentado para a classe minhaClasse o trecho acima contém um erro... como arrumar?
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 25: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/25.jpg)
25/29
Classes
• Classes
• Construtor de cópia
• Utilizado quando um objetonão existe e é realizadaalguma atribuição ouchamado explicitamente
• Operador de cópia
• Utilizado quando um objetojá existe e é realizada umaatribuição
class minhaClasse{public:
int algo;minhaClasse(int valor){
algo = valor;cout << valor << endl;
}minhaClasse(const minhaClasse & outro){
this->algo = outro.algo;cout << algo << endl;
}minhaClasse & operator= (const minhaClasse & outro){
this->algo = outro.algo;cout << "copia!" << endl;return *this;
}~minhaClasse(){
cout << algo << endl;}
};
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 26: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/26.jpg)
26/29
Classes
• Classes – Exemplo “Ponto”#include <iostream>#include <cmath>using namespace std;class ponto{private:
int x, y;public:
ponto(int x, int y){
this->x = x;this->y = y;
}
double distancia(const ponto & p2){
return sqrt((this->x - p2.x)*(this->x - p2.x) + (this->y - p2.y)*(this->y - p2.y));}
};int main(){
ponto p1(1, 1), p2(0, 0);cout << p1.distancia(p2) << endl;return 0;
}
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 27: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/27.jpg)
27/29
Classes
• Classes – Exemplo “Ponto”
• Uso de ocultamento
• Uso de construtor
• Uso do ponteiro this
• Uso de const correctness
• Uso de referência
• Acesso de membro privado emoutro objeto
#include <iostream>#include <cmath>using namespace std;class ponto{private:
int x, y;public:
ponto(int x, int y){
this->x = x;this->y = y;
}
double distancia(const ponto & p2){
return sqrt((this->x - p2.x)*(this->x - p2.x) + (this->y - p2.y)*(this->y - p2.y));}
};int main(){
ponto p1(1, 1), p2(0, 0);cout << p1.distancia(p2) << endl;return 0;
}
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 28: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/28.jpg)
28/29
Classes
• Idiomas relevantes do C++ para esta aula
• Regra dos três (rule of three – futuramente será rule of five)
• Conte, não fale (Tell, don’t ask)
Procedural code gets information then makes decisions.
Object-oriented code tells objects to do things.
— Alec Sharp
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas
![Page 29: Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador](https://reader033.vdocuments.net/reader033/viewer/2022050609/5fb0ba75d7ab0814e95aaa67/html5/thumbnails/29.jpg)
29/29
Classes
• Idiomas relevantes do C++ para esta aula
• Getters / Setters – Leitura:
• RAII (Resource Acquisition Is initialization)
http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html
Classes Encapsulamento this Construtores/Destrutores Construtor de Cópia Exemplo Ponto Idiomas