29
1/29 Fundamentos de Programação Orientada 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 5 Prof. Daniel Cavalcanti Jeronymo Universidade Tecnológica Federal do Paraná (UTFPR) Engenharia Eletrônica – 3º Período 2016.1 ET43I

Fundamentos de Programaçãodanielc/Ensino/Graduacao... · 2016-03-28 · Fundamentos de Programação Orientada a Objetos Classes e instâncias. Construtores, destrutores e operador

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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