paradigmas e ferramentas de desenvolvimento de software – revisão da linguagem c++ lúbia vinhas...

30
Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Upload: internet

Post on 18-Apr-2015

110 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++

Lúbia VinhasDPI - INPE

Page 2: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Histórico

Criada e desenvolvida por Bjarne Stroustroup no AT&T Bell Laboratories na década de 80

http://www.research.att.com/~bs Orientada-a-objetos

Page 3: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Requisitos de C++

Mecanismos de linguagem voltados para permitir a criação de tipos que são mais apropriados a nossa maneira de pensar ou ao nosso domínio de aplicação, do que aqueles internos da linguagem

O mecanismo de C++ para a criação de tipos definidos pelo usuário são as classes (seguindo aquele da linguagem Simula)

Através das abstrações em classes é possível a criação de tipos concretos e abstratos por parte dos usuários

Page 4: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Elementos básicos

Tiposbool, char, int, float, double

enum

void

Ponteiros: int*

Vetores: char[]

Referências: double&

Tamanhos e comportamento são definidos pela implementação

Declarações e definiçõeschar ch;

int count = 1;

Page 5: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Elementos Básicos

Ponteiros: para um dado tipo T, T* é do tipo “ponteiro para T” Indireção: operador * retorna “o conteúdo do ponteiro” Zero: 0 é convertido para int, em C++ melhor do que NULL (C) Arrays: para um dado tipo T, T[size] é um “vetor de size

elementos do tipo T” Devem ser inicializados com tamanhos constantes:

int v1[10];

int v2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

Nome de um array pode ser utilizado como ponteiro para elemento inicialint* p1 = v2;

p1++; // (*p1) é igual a 2

Page 6: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Elementos básicos

Constantes: const int tam = 90;

Ponteiros e constantes:char* const cp; // ponteiro constante para um caracter

char const* pc; // ponteiro para um caracter constante

const char*pc2; // ponteiro para um caracter constante

Referências: são nomes alternativos para objetosint i=1;

int& r=i; // r e i referenciam o mesmo inteiro

void incr(int& aa) { aa++; }

incr(i); // i = 2;

Page 7: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Elementos básicos

Alocação e liberação de memória: objetos possuem vida útil

dentro do escopo de programa onde são criados

Para criar objetos que existem independente do escopo onde

foram criados: new e delete (“on the free store”)

Um objeto criado por new existe até que seja destruído por

delete

Node* no = new Node; // objeto individual

delete no;

int* q = new int[10]; // array de objetos

delete []q;

Page 8: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Elementos básicos: funções

Funçõesextern void swap(int*, int*); // declaração

void swap (int* p, int* q) // definição

{

int t = *q;

*p = *q;

*q = t;

}

Variáveis estáticasvoid f(int a)

{

static int n = 0;

int x = 0;

cout << “n = “ << n++ << “x = “ << x++;

}

Page 9: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Elementos Básicos: funções

Passagem de parâmetros:void f(int val, int& ref){

val++;

ref++;

}

Eficiência: passar objetos grandes por referência mas fazê-los constante para evitar modificaçõesvoid g (const Large& arg)

{

... // valor de arg não pode ser alterado

}

Arrays são passados como argumentos através de ponteiro para sua primeira posição

main()

{

int i=1;

int j=1;

f(i,j);

}

Page 10: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Elementos básicos: funções

Valor de retorno:int f() { int i=0; return i; }

int* fp() { int local=0; return &local; } // erro!

int& fr() { int local=0; return local; } // erro!

Overloading: possível tomando-se em conta os tipos de

parâmetrosvoid print(int);

void print(const char*);

void print(double);

Argumento defaultVoid print(int value, int base=10);

Page 11: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Classes

Mecanismo de C++ que permite aos usuários a contrução de

tipos, que poedem ser usados convenientemente como tipos

básicos (“user defined” e “built-in”)

Um tipo é a representação de um conceito (ex: tipo float e

operações +, -, *,/ é a representação do conceito matemático

de um número real)

Uma classe é um tipo definido pelo usuário, que não tem

similar entre os tipos nativos.

Page 12: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Classes

class Date{

private:

int d, m, y; // membros

static Date default_date;

public:

void init(int dd, int mm, int yy); // métodos

void addYear(int n);

void addMonth(int n);

void addDay(int n);

static void set_default (int, int, int);

}

Membros estásticos são parte das classes mas não parte dos objetosvoid f()

{

Date::set_default(4,5,1945);

}

Page 13: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Controle de acesso

Membros/Métodos private de uma classe são accessíveis somente pelos outros membros da mesma classe ou por classes friend

Membros/Métodos protected são accessíveis também pelas classes derivadas de uma classe

Membros/Métodos public são acessíveis a partir de qualquer ponto onde a classe é visível

Page 14: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Construtores

São a forma de inicialização de objetos de uma determinada classeclass Date{

//...

Date(int, int, int); // construtor

};

Construtores podem ser sobrecarregados, ou seja, podem ser fornecidas diferentes versões com diferentes tipos de parâmetros

Se não for fornecido nenhum construtor, o compilador irá criar um default

Date hoje = Date(2,10,2002);

Date natal(25,12,2002);

Date aniver; // Erro! Não existe Date()

Date versao_3(10,10); // Erro! Nao existe Date com 3 args

Page 15: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Construtores

Aceitam valores default (Date(int, int, int yy=2002))

Construtor Default não recebe parâmetros (Date())Date d1;

Construtor de cópia: constrói um objeto novo a partir de um outro já criadoDate d2(d1);

Date d3 = d1;

Passar parâmetros por valor, implica chamada no construtor de cópia, portanto prefira a passagem de parâmetros por referência

Se necessário e não fornecido pelo usuário, o compilador irá criar um

Page 16: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Construtores

Prefira lista de inicialização ao invés de atribuição no corpo do construtor:Date::Date(int dd, int mm, int yy):

d(dd), m(mm), y(yy) { }

Date:: Date(int dd, int mm, int yy)

{ d = dd; m = mm; y = yy; }

Defina a lista de inicialização na mesma ordem com que os membros foram declarados

Certifique-se que todos os membros da classe foram inicializados principalmente ponteiros

Page 17: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Destrutores

Devem liberar toda a memória que foi alocada no construtores

Caso não sejam implementados, o compilador irá fornecer um

String::~String() { delete [] data; }

Page 18: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Sobrecarga de operadores

Permite que classes criadas pelo usuário sejam manipuladas de maneira convencional de acordo com uma notação conveniente.class Complex {

double re, im;

public:

Complex(double, double i): re(r), im(i) {}

Complex operator+(Complex);

};

Complex a = Complex(1.3, 1.8);

Complex b = Complex(1.3,2.0);

Complex c;

c = a + b; // c = a.operator+(b)

Page 19: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Operador de associação (=)

Se não implementado é fornecido pelo compilador Date d1(2,2,2002), d2;

d2 = d1;

Forneça suas próprias versões do construtor de cópia e operador de associação se você tem ponteiros em suas classesclass String { //...

private:

char* data_;

public:

String(char* s) {...}

};

String a("Hello"), b("World");

b = a;

Page 20: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Operator =

Garanta que o valor de retorno seja uma referência a thisDate& operator=(const Date rhs)

{...; return *this;}

Date d1, d2, d3;

d1 = d2 = d3; // torna possível o encadeamento

Verifique a auto referênciaString& String::operator=(const String& rhs){ delete [] data; data = new char[strlen(rhs.data) + 1]; strcpy(data, rhs.data); return *this; }String a; a=a;

Page 21: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Operator =

Garanta que o valor de retorno seja uma referência a thisDate& operator=(const Date rhs)

{...; return *this;}

Date d1, d2, d3;

d1 = d2 = d3; // torna possível o encadeamento

Verifique a auto referênciaString& String::operator=(const String& rhs){

if (rhs == *this) return *this;

delete [] data; data = new char[strlen(rhs.data) + 1]; strcpy(data, rhs.data); return *this; }String a; a=a;

Garanta que todos os membros da classe são associados

Page 22: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Forma canônica

class Exemp {

public:

Exemp(); // construtor

virtual ~Exemp(); // virtual se classe base

protected:

// Dados que meus filhos precisam

private:

// Meus dados pessoais

Exemp (const Exemp& rhs) {} // construtor de copia

Exemp& operator= (const Exempl& rhs) {}// atribuicao

}

Page 23: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Funções amigas

A declaração normal de uma função em um classe garante logicamente que:

1. O método pode acessar as parte privadas da classe onde é declarado

2. O método existe no escopo da classe3. O método deve ser invocado através de um objeto da classe

As funções estáticas eliminam a restrição 3Date::set_default(1,1,2002);

As funções friends eleminam as restrições 3 e 2class Date { ...

int d, m, y;public: friend Date tomorrow(const Date& today);}Date tomorrow(const Date& today){ Date res(today.d+1, today.m, today.y); return res; }

Page 24: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Classes amigas

Permitem que uma classe acesse as partes privadas de outra

class CSquare;class CRectangle { int width, height;public:

void convert (CSquare a);};

class CSquare { private: int side; public:

friend class CRectangle; };

void CRectangle::convert (CSquare a) { width = a.side; height = a.side;}

Page 25: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Referências

Passagem de parâmetros e retorno por referência constante é

mais eficiente e seguro

Person returnPerson(Person p) { return p; }

Person& returnPerson(const Person& p) { return p; }

No entanto, quando o valor de retorno é criado na função, não

se pode retornar referênciaComplex& operator + ( const Compl& lhs, const Compl& rhs ){ Complex result ( lhs.real_ + rhs.real_ , lhs.im_ + rhs.im_ ); return result;}

Page 26: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Classes Derivada

Classes represetam conceitos, classes derivadas expressam relacionamentos hierárquicos entre eles

Uma classe derivada de uma classe básica herda as propriedades da classe básica, podendo acrescentar ou especializar propriedades destaclass Person { ... };

class Student: public Person { ... };

Empregado

Gerente

Polígono

Retângulo

Quadrado

Page 27: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Classes Derivadas

Classes derivadas publicamente, possuem acesso a todos os membros públicos e protegidos das classes básicas class Empregado {

string nome, sobrenome;

public:

string nomeCompleto() const

{ return nome + ‘ ‘ + sobrenome; } };

class Gerente : public Empregado {

int dep;

public:

void print() const{ cout << “meu nome e: “ << nomeCompleto() << \n; } };

Podem acessar explicitamente métodos das classes básicasvoid Gerente::print() const

{

Empregado::print();

cout << “gerente”;

}

Page 28: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Classes Derivadas

Construtores de classes derivadas não podem instanciar membros das classes básicasEmpregado::Empregado(const string& n, const string& s):

nome(n), sobrenome(s) {...}

Gerente::Gerente(const string& n, const string& s, int d) :

Empregado(n,s), dep(d) {...}

Objetos são construídos na seguinte ordem: classe base, os

membros da classe, e a classe derivada

Objetos são destruídos na ordem inversa: a classe derivada,

seus membros e a classe derivada

Construtores e operadores de associação não são herdados

Page 29: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Classes derivadas

Objetos de classes derivadas podem ser tratados como

objetos de classes básicas quando manipulados através de

ponteiros e referências

vector<Empregado*> rh;

Empregado e1(“Luis”,”Azevedo”);

Gerente g1(“Antonio”,”Camargo”,1);

rh.push_back(&e1);

rh.push_back(&e2);

Page 30: Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE

Funções virtuais

Permitem a reimplementação de funções definidas na classe base pelas classes derivadasclasse Empregado {

public: virtual void print() const;

}class Gerente : public Empregado {

public: void print() const;}

void f(const Empregado& emp){

emp.print();}