Aula 10
Tipos Abstractos de Dados I
Flashback
Lembram-se da Aula 4?
2
Introdução à Programação
2003/2004
Soma de fracções (I)
#include <iostream>
#include <cassert>
using namespace std;
/** Devolve o máximo divisor comum dos inteiros passados como argumento.
@pre m ≠ 0 ou n ≠ 0.
@post mdc = mdc(m, n). */
int mdc(int const m, int const n)
{
assert(m != 0 or n != 0);
}
PC relaxada para
aceitar inteiros
negativos e nulos
(ver folhas teóricas)
…
(continua)
3
Introdução à Programação
2003/2004
Soma de fracções (II)
/** Reduz a fracção recebida como argumento.
@pre denominador ≠ 0 numerador = n denominador = d.
@post denominador ≠ 0 mdc(numerador, denominador ) = 1
numerador/denominador = n/d. */
void reduzFracção(int& numerador, int& denominador)
{
assert(denominador != 0);
int const divisor = mdc(numerador, denominador);
numerador /= divisor;
denominador /= divisor;
assert(denominador != 0);
assert(mdc(numerador, denominador) == 1);
}
(continua)
4
Introdução à Programação
2003/2004
Soma de fracções (III)
int n, d;
/** Lê do teclado uma fracção, na forma de dois inteiros sucessivos.
cin >>
n >> d;= n denominador = d.
@pre
numerador
if(cin.good())
@post
Se cin.good() cin tem dois inteiros n' e d' disponíveis para
if(d == 0)
leitura,
com d' ≠ 0, então
cin.setstate(ios_base::failbit);
else
{
0 < denominador
mdc(numerador, denominador) = 1
if(d < 0) {
numerador/denominador
numerador = -n;= n'/d' cin.fail(),
senão numerador
= n =denominador
= d cin.fail(). */
denominador
-d;
}
else
{
void lêFracção(int& numerador, int& denominador)
numerador = n;
{
denominador = d;
}
…
reduzFracção(numerador, denominador);
}
Não existia na Aula 4!
assert(0 < denominador);
assert(mdc(numerador, denominador) == 1);
assert(numerador * d == n * denominador);
Garante-se
assert(not cin.fail());
(continua)
}
denominador positivo
e representação em
termos mínimos.
return;
assert(cin.fail());
5
Introdução à Programação
2003/2004
Soma de fracções (IV)
/** Soma duas fracções.
@pre denominador1 ≠ 0 denominador2 ≠ 0.
@post numerador/ denominador = numerador1/denominador1 +
numerador2/denominador2
denominador ≠ 0 mdc(numerador, denominador) = 1. */
void somaFracção(int& numerador, int& denominador,
int const numerador1, int const denominador1,
int const numerador2, int const denominador2)
{
assert(denominador1 != 0);
assert(denominador2 != 0);
Não existia
na Aula 4!
numerador = numerador1 * denominador2 +
numerador2 * denominador1;
denominador = denominador1 * denominador2;
reduzFracção(numerador, denominador);
assert(denominador != 0);
assert(mdc(numerador, denominador) == 1);
}
(continua)
6
Introdução à Programação
2003/2004
Soma de fracções (V)
/** Escreve uma fracção no ecrã no formato usual.
@pre V.
@post cout.fail() cout contém n/d (ou simplesmente n, se d = 1) em
que n e d são os valores de numerador e denominador. */
void escreveFracção(int const numerador,
int const denominador)
{
cout << numerador;
if(denominador != 1)
cout << '/' << denominador;
}
(continua)
7
Introdução à Programação
2003/2004
Soma de fracções (VI)
int main()
{
// Ler fracções:
cout << "Introduza duas fracções (numerador denominador): ";
int n1, d1, n2, d2;
lêFracção(n1, d1);
lêFracção(n2, d2);
if(cin.fail()) {
cout << "Opps!
return 1;
}
A leitura das fracções falhou!" << endl;
(continua)
8
Introdução à Programação
2003/2004
Soma de fracções (VII)
// Calcular fracção soma reduzida:
int n, d;
somaFracção(n, d, n1, d1, n2, d2);
// Escrever resultado:
cout << "A soma de ";
escreveFracção(n1, d1);
cout << " com ";
escreveFracção(n2, d2);
cout << " é ";
escreveFracção(n, d);
cout << '.' << endl;
}
9
Introdução à Programação
2003/2004
Problemas
Dois inteiros para cada fracção
Não é possível desenvolver funções para
somar fracções:
10
funções só devolvem um valor
Código complexo e difícil de perceber
Introdução à Programação
2003/2004
Objectivo
11
Escrever programa para somar fracções tão
simples como para somar inteiros
Ou seja…
Introdução à Programação
2003/2004
O nosso objectivo
#include <iostream>
using namespace std;
…
int main()
{
Lá chegaremos,
lá chegaremos…
cout << "Introduza
duas fracções
(numerador denominador): ";
Racional r1, r2;
cin >> r1 >> r2;
if(cin.fail()) {
cout << "Opps! A leitura dos racionais falhou!" << endl;
return 1;
}
Racional r = r1 + r2;
cout << "A soma de " << r1 << " com " << r2 << " é "
<< r << '.' << endl;
}
12
Introdução à Programação
2003/2004
Solução
13
Criar um novo tipo de dados que permita
representar um número racional (fracção) com
uma só instância
Ou seja, criar um Tipo Abstracto de Dados
(TAD)
Introdução à Programação
2003/2004
Tipos Abstractos de Dados (TAD)
Ou Tipos de Primeira Categoria
Características:
Tipo definido pelo programador
Comporta-se como os tipos básicos
Serve para definir variáveis e constantes com
que se pode operar
Representado pelas classes C++
Não confundir “classe C++” com
“classe” (propriamente dita)…
Introdução à Programação
14
Pormenores
só em POO
2003/2004
TAD Racional
/** Representa números racionais. */
class Racional {
Variáveis
public:
membro ou
atributos
int numerador;
int denominador;
};
Atenção ao ; final!
15
Introdução à Programação
2003/2004
TAD Racional
#include <iostream>
#include <cassert>
using namespace std;
int mdc(int const m, int const n)
{
…
}
/** Representa números racionais. */
class Racional {
public:
int numerador;
int denominador;
};
…
16
Introdução à Programação
2003/2004
Representação gráfica do TAD
Nome
Racional
numerador: int
denominador: int
Atributos:
instâncias
membro
Operações:
rotinas
membro
17
Introdução à Programação
2003/2004
Utilização do TAD
Racional r1;
Racional r2;
r1.numerador = 6;
r1.denominador = 9;
r2.numerador = 7;
r2.denominador = 3;
18
Cada instância de Racional tem os seus próprios
atributos!
Introdução à Programação
2003/2004
Representações gráficas (I)
r1: Racional
numerador = 6
?
denominador = 9
?
Instâncias do TAD
Objectos
Há quem lhes
chame objectos,
mas reservaremos
esse nome para as
classes
propriamente ditas.
19
r2: Racional
numerador = 7
?
denominador = 3
?
Introdução à Programação
2003/2004
Representações gráficas (II)
20
r1: Racional
r2: Racional
numerador: int
numerador: int
6
7
denominador: int
denominador: int
9
3
Introdução à Programação
2003/2004
Acesso a membros de instâncias
de um TAD
Operador de selecção de membro: .
instância.membro
21
Introdução à Programação
2003/2004
Função somaDe()
/** Devolve a soma de dois racionais.
@pre r1.denominador ≠ 0 r2.denominador ≠ 0.
@post somaDe = r1 + r2 somaDe.denominador ≠ 0
mdc(somaDe.numerador, somaDe.denominador) = 1. */
Racional somaDe(Racional const r1, Racional const r2)
{
assert(r1.denominador != 0);
Nome sem sufixo
assert(r2.denominador != 0);
Fracção:
redundante dado tipo dos
parâmetros.
Racional r;
r.numerador = r1.numerador * r2.denominador +
r2.numerador * r1.denominador;
r.denominador = r1.denominador * r2.denominador;
reduz(r);
assert(r.denominador != 0);
assert(mdc(r.numerador, r.denominador) == 1);
A fazer.
return r;
}
22
Introdução à Programação
2003/2004
Procedimento reduz()
/** Reduz a fracção que representa o racional recebido como argumento.
@pre r.denominador ≠ 0 r = r.
@post r.denominador ≠ 0
mdc(r.numerador, r.denominador) = 1 r = r. */
void reduz(Racional const r)
{
assert(r.denominador != 0);
int const divisor = mdc(r.numerador, r.denominador);
r.numerador /= divisor;
r.denominador /= divisor;
Nome sem sufixo Fracção:
redundante dado tipo dos
parâmetros.
assert(r.denominador != 0);
assert(mdc(r.numerador, r.denominador) == 1);
}
23
Introdução à Programação
2003/2004
Procedimento lêPara()
/** Lê do teclado um racional, na forma de dois inteiros sucessivos.
@pre r = r.
@post Se cin.good() cin tem dois inteiros n e d disponíveis para
leitura, com d <> 0, então r = n/d cin.fail()
0 < r.denominador mdc(r.numerador, r.denominador) = 1,
senão r = r cin.fail(). */
void lêPara(Racional& r)
{
…
}
24
Introdução à Programação
2003/2004
Procedimento lêPara()
int n, d;
cin >> n >> d;
if(not cin.fail())
if(d == 0)
cin.setstate(ios_base::failbit);
else {
if(d < 0) {
r.numerador = -n;
r.denominador = -d;
} else {
r.numerador = n;
r.denominador = d;
}
reduz(r);
assert(0 < r.denominador);
assert(mdc(r.numerador, r. denominador) == 1);
assert(r.numerador * d == n * r.denominador);
assert(not cin.fail());
}
return;
assert(cin.fail());
25
Introdução à Programação
2003/2004
Procedimento escreve()
/** Escreve um racional no ecrã no formato de uma fracção.
@pre V.
@post cout.fail() cout contém n/d (ou simplesmente n, se d = 1) em que n e d
são os valores de r.numerador e r.denominador. */
void escreve(Racional const r)
{
cout << r.numerador;
if(r.denominador != 1)
cout << '/' << r.denominador;
}
26
Introdução à Programação
2003/2004
Programa principal (I)
int main()
{
// Ler fracções:
cout << "Introduza duas fracções (numerador denominador): ";
Racional r1, r2;
lêPara(r1);
lêPara(r2);
if(cin.fail()) {
cout << "Opps!
return 1;
}
A leitura dos racionais falhou!" << endl;
(continua)
27
Introdução à Programação
2003/2004
Programa principal (II)
// Calcular racional soma:
Racional r = somaDe(r1, r2);
// Escrever resultado:
cout << "A soma de ";
escreve(r1);
cout << " com ";
escreve(r2);
cout << " é ";
escreve(r);
cout << '.' << endl;
}
28
Introdução à Programação
2003/2004
Inicialização
Para inicializar um racional:
Racional a;
a.numerador = 10;
a.denominador = 0;
Para inicializar um inteiro:
Mas como inicializar
um racional tão
simplesmente como
um inteiro?
Como evitar
inicializações
inválidas?
int a = 10;
int a(10);
29
Introdução à Programação
2003/2004
Rotinas membro?
30
Sim! Classes C++ podem ter rotinas membro!
Operação: declaração de rotina membro
Método: definição de rotina membro
Diz-se que as classes C++ têm operações que
são implementadas por métodos
Introdução à Programação
2003/2004
Construtores (I)
31
Construir uma instância de um TAD é
instanciá-lo
Durante a construção é invocada uma
operação especial: um construtor
Como não definimos um construtor, o
compilador forneceu um que não faz nada
Introdução à Programação
2003/2004
Construtores: declaração
/** Representa números racionais. */
class Racional {
public:
/** Constrói racional com valor inteiro.
Construtor invocável sem
argumentos: constrói
racional 0/1
@pre V.
@post *this = n 0 < denominador mdc(numerador, denominador) = 1. */
Racional(int const n = 0);
/** Constrói racional correspondente a n/d.
@pre d ≠ 0.
@post *this = n/d 0 < denominador
mdc(numerador, denominador) = 1. */
Racional(int const n, int const d);
int numerador;
int denominador;
};
32
Construtor que recebe
como argumento o
numerador: constrói
racional n/1
Construtor que recebe como
argumentos o numerador e o
denominador: constrói
racional n/d
Introdução à Programação
2003/2004
Construtores: implementação (I)
class Racional {
…
};
Racional::Racional(int const n)
: numerador(n), denominador(1)
{
Lista de inicializadores
assert(0 < denominador);
assert(mdc(numerador, denominador) == 1);
}
(continua)
Prefixo
identifica classe
a que o método
pertence
33
Introdução à Programação
2003/2004
Construtores: implementação (II)
Racional::Racional(int const n, int const d)
{
assert(d != 0);
Acesso directo
if(d < 0) {
numerador =
denominador
} else {
numerador =
denominador
}
a atributos da instância
impícita
-n;
= -d;
n;
= d;
Variável, ou melhor, instância implícita,
ou seja, a instância que está em
construção
reduz(*this);
assert(0 < denominador);
assert(mdc(numerador, denominador) == 1);
assert(numerador * d == n * denominador);
}
34
Introdução à Programação
2003/2004
Construtores: implementação (III)
if(d < 0) {
numerador =
denominador
} else {
numerador =
denominador
}
-n;
= -d;
n;
= d;
reduz(*this);
Garante-se denominador positivo e
representação em termos mínimos.
Para quê?
35
Introdução à Programação
2003/2004
A reter...
*this: explicitação da instância implícita
Construtores:
Se não forem definidos construtores:
36
operações com mesmo nome da classe
não têm tipo de devolução
sobrecarregáveis
C++ fornece um sem parâmetros e que não faz nada
Atributos da instância implícita directamente acessíveis
dentro de métodos
Operações declaradas dentro da classe
Métodos definidos fora da classe
Introdução à Programação
2003/2004
O que já podemos fazer
Construtores
invocados
automaticamente
Racional r1;
Racional r2(6, 9);
escreve(r1);
escreve(r2);
37
Aparece 0! TAD nunca têm
lixo!
Aparece 2/3
Introdução à Programação
2003/2004
O que ainda podemos fazer...
Racional r(6, 9);
r.denominador = 0;
O denominador
tem de ser
diferente de zero.
Como impedir
acesso indevidos?
38
Introdução à Programação
2003/2004
Categorias de acesso
39
Os membros podem ser
públicos (public)
protegidos (protected)
privados (private)
Introdução à Programação
2003/2004
Categorias de acesso
Os membros podem ser
públicos (public)
protegidos (protected)
privados (private)
Acessíveis por todos
POO!
Acessíveis apenas
pelos membros da
classe
40
Introdução à Programação
2003/2004
Princípio do encapsulamento
Tudo o que pode ser privado, deve ser privado!
Regra: Todos os atributos das classes devem
ser privados
Excepção: constantes podem
ocasionalmente ser públicas
41
Os construtores da classe foram feitos
públicos: porquê?
Introdução à Programação
2003/2004
Atributos privados
/** Representa números racionais. */
class Racional {
public:
/** Constrói racional com valor inteiro.
@pre V.
@post *this = n 0 < denominador mdc(numerador, denominador) = 1. */
Racional(int const n = 0);
/** Constrói racional correspondente a n/d.
@pre d ≠ 0.
@post *this = n/d 0 < denominador
mdc(numerador, denominador) = 1. */
Racional(int const n, int const d);
private:
int numerador;
int denominador;
};
42
Introdução à Programação
2003/2004
Continua tudo a funcionar?
Racional r(6, 9);
escreve(r);
Não tem acesso aos
atributos por serem
privados.
Faça-se o procedimento
membro!
43
Introdução à Programação
2003/2004
Operação
Racional::escreve()
/** Representa números racionais. */
class Racional {
public:
…
/** Escreve um racional no ecrã no formato de uma fracção.
@pre V.
@post cout.fail() ou cout contém n/d (ou simplesmente n, se d = 1) em
que n e d são os valores de numerador e denominador. */
void escreve();
private:
int numerador;
int denominador;
};
44
Operação pública.
Porquê?
Introdução à Programação
2003/2004
Método Racional::escreve()
void Racional::escreve()
{
cout << numerador;
if(denominador != 1)
cout << '/' << denominador;
}
45
Introdução à Programação
2003/2004
Invocação de operações
Operador de selecção de membro: .
Racional r1();
Racional r2(6, 9);
r1.escreve();
r2.escreve();
Numerador de quem?
46
void Racional::escreve()
{
cout << numerador;
if(denominador != 1)
cout << '/' << denominador;
}
Introdução à Programação
2003/2004
Operação
Racional::somaCom()
/** Representa números racionais. */
class Racional {
public:
…
/** Devolve a soma de dois racionais.
@pre denominador ≠ 0 r2.denominador ≠ 0.
@post somaDe = *this + r2 denominador ≠ 0
somaDe.denominador ≠ 0
mdc(somaDe.numerador, somaDe.denominador) = 1. */
Racional somaCom(Racional const r2);
private:
int numerador;
int denominador;
};
47
Introdução à Programação
2003/2004
Método Racional::somaCom()
Racional Racional::somaCom(Racional const r2)
{
assert(denominador != 0);
assert(r2.denominador != 0);
Soma da instância
implícita com r2.
Racional r;
r.numerador = numerador * r2.denominador +
r2.numerador * denominador;
r.denominador = denominador * r2.denominador;
r.reduz();
assert(denominador != 0);
assert(r.denominador != 0);
assert(mdc(r.numerador, r.denominador) == 1);
return r;
}
48
Introdução à Programação
2003/2004
Operação Racional::lê()
/** Representa números racionais. */
class Racional {
public:
…
/** Lê do teclado um racional, na forma de dois inteiros sucessivos.
@pre *this = r.
@post Se cin.good() cin tem dois inteiros n e d disponíveis para
leitura, com d <> 0, então *this = n/d cin.fail()
0 < denominador mdc(numerador, denominador) = 1,
senão *this = r cin.fail(). */
void lê();
private:
int numerador;
int denominador;
};
49
Introdução à Programação
2003/2004
Método Racional::lê()
n, d;
voidint
Racional::lê()
{
cin >> n >> d;
…
if(not cin.fail())
}
if(d == 0)
cin.setstate(ios_base::failbit);
else {
if(d < 0) {
numerador = -n;
denominador = -d;
} else {
numerador = n;
denominador = d;
}
reduz();
assert(0 < denominador);
assert(mdc(numerador, denominador) == 1);
assert(numerador * d == n * denominador);
assert(not cin.fail());
}
return;
assert(cin.fail());
50
Introdução à Programação
2003/2004
Operação Racional::reduz()
/** Representa números racionais. */
class Racional {
public:
…
Operação privada.
Porquê?
private:
/** Reduz a fracção que representa o racional recebido como argumento.
@pre denominador ≠ 0 r = r.
@post denominador ≠ 0
mdc(numerador, denominador) = 1 *this = r. */
void reduz();
int numerador;
int denominador;
};
51
Introdução à Programação
2003/2004
Método Racional::reduz()
void Racional::reduz()
{
assert(denominador != 0);
int const divisor = mdc(numerador, denominador);
numerador /= divisor;
denominador /= divisor;
assert(denominador != 0);
assert(mdc(numerador, denominador) == 1);
}
52
Introdução à Programação
2003/2004
Programa principal (I)
int main()
{
// Ler fracções:
cout << "Introduza duas fracções (numerador denominador): ";
Racional r1, r2;
r1.lê();
r2.lê();
if(cin.fail()) {
cout << "Opps!
return 1;
}
A leitura dos racionais falhou!" << endl;
(continua)
53
Introdução à Programação
2003/2004
Programa principal (II)
(continuação)
// Calcular racional soma:
Racional r = r1.somaCom(r2);
// Escrever resultado:
cout << "A soma de ";
r1.escreve();
cout << " com ";
r2.escreve();
cout << " é ";
r.escreve();
cout << '.' << endl;
Horrendo!
}
54
Introdução à Programação
2003/2004
E mdc()?
Deveria passar a membro?
Porquê?
55
Introdução à Programação
2003/2004
Classe é módulo por excelência
Interface
56
Parte pública
Implementação
Parte privada
Métodos (implementação das operações)
Manual de utilização (contrato)
Comentário de documentação da classe
Manual de utilização de cada operação pública
Introdução à Programação
2003/2004
Desenho de TAD
57
Começar sempre:
pela interface e
pelo contrato.
Introdução à Programação
2003/2004
Condição Invariante da Classe
Condição Invariante da Classe (CIC) Racional:
0 < denominador
mdc(numerador, denominador) = 1
Condição mais forte que se verifica sempre para todas as
instâncias de uma classe
Reflecte as assunções do produtor da classe acerca da sua
implementação
Objectivo: verificar erros do programador
Deve verificar-se no início e no fim de cada método nãoprivado (no final dos construtores)
58
Introdução à Programação
2003/2004
Operação
Racional::cumpreInvariante()
/** Representa números racionais.
@invariant 0 < denominador mdc(numerador, denominador) = 1. */
class Racional {
public:
…
private:
/** Indica se a CIC se verifica.
@pre V.
@post cumpreInvariante =
0 < denominador mdc(numerador, denominador) = 1. */
bool cumpreInvariante();
int numerador;
int denominador;
};
59
Introdução à Programação
2003/2004
Método
Racional::cumpreInvariante()
bool Racional::cumpreInvariante()
{
return 0 < denominador and mdc(numerador, denominador) == 1;
}
60
Introdução à Programação
2003/2004
Operação
Racional::Racional()
/** … */
class Racional {
public:
/** Constrói racional com valor inteiro.
@pre V.
@post *this = n. */
Racional(int const n = 0);
…
private:
…
};
61
Introdução à Programação
2003/2004
Método
Racional::Racional()
Racional::Racional(int const n)
: numerador(n), denominador(1)
{
assert(cumpreInvariante());
}
62
Introdução à Programação
2003/2004
Operação
Racional::Racional()
/** … */
class Racional {
public:
…
/** Constrói racional correspondente a n/d.
@pre d ≠ 0.
@post *this = n/d. */
Racional(int const n, int const d);
…
private:
…
};
63
Introdução à Programação
2003/2004
Método
Racional::Racional()
Racional::Racional(int const n, int const d)
{
assert(d != 0);
if(d < 0) {
numerador =
denominador
} else {
numerador =
denominador
}
-n;
= -d;
n;
= d;
reduz();
assert(cumpreInvariante());
assert(numerador * d == n * denominador);
}
64
Introdução à Programação
2003/2004
Operação
Racional::escreve()
/** … */
class Racional {
public:
…
/** Escreve um racional no ecrã no formato de uma fracção.
@pre V.
@post cout.fail() ou cout contém n/d (ou simplesmente n, se d = 1) em
que n e d são os valores de numerador e denominador. */
void escreve();
…
private:
…
};
65
Introdução à Programação
2003/2004
Método Racional::escreve()
void Racional::escreve()
{
assert(cumpreInvariante());
cout << numerador;
if(denominador != 1)
cout << '/' << denominador;
assert(cumpreInvariante());
}
66
Introdução à Programação
2003/2004
Operação
Racional::somaCom()
/** … */
class Racional {
public:
…
/** Devolve a soma de dois racionais.
@pre V.
@post somaDe = *this + r2. */
Racional somaCom(Racional const r2);
…
private:
…
};
67
Introdução à Programação
2003/2004
Método Racional::somaCom()
Racional Racional::somaCom(Racional const r2)
{
assert(cumpreInvariante());
assert(r2.cumpreInvariante());
Racional r;
r.numerador = numerador * r2.denominador +
r2.numerador * denominador;
r.denominador = denominador * r2.denominador;
r.reduz();
assert(cumpreInvariante());
assert(r.cumpreInvariante());
return r;
}
68
Introdução à Programação
2003/2004
Operação Racional::lê()
/** … */
class Racional {
public:
…
/** Lê do teclado um racional, na forma de dois inteiros sucessivos.
@pre *this = r.
@post Se cin.good() cin tem dois inteiros n e d disponíveis para
leitura, com d <> 0, então *this = n/d cin.fail(),
senão *this = r cin.fail(). */
void lê();
private:
…
};
69
Introdução à Programação
2003/2004
Método Racional::lê()
voidassert(cumpreInvariante());
Racional::lê()
{
int n, d;
…
cin >> n >> d;
}
if(not cin.fail())
if(d == 0)
cin.setstate(ios_base::failbit);
else {
if(d < 0) {
numerador = -n;
denominador = -d;
} else {
numerador = n;
denominador = d;
}
reduz();
assert(cumpreInvariante());
assert(numerador * d == n * denominador);
assert(not cin.fail());
}
return;
assert(cumpreInvariante());
assert(cin.fail());
70
Introdução à Programação
2003/2004
Aula 10: Sumário
71
Necessidade de TAD: acrescentando tipos ao C++
Sintaxe da definição de classes C++
Sintaxe da definição de variáveis e constantes de uma classe C++: as instâncias e a
instanciação
Variáveis e constantes membro: instâncias membro ou atributos
Acesso a atributos membro de uma classe C++: operador de selecção de membro.
Rotinas membro:
Operações e métodos
Declaração vs. definição.
A construção TAD::
Acesso a membros de uma classe C++: a instância implícita
Construtores:
Sintaxe
Utilização
Parâmetros com argumentos por omissão de novo
Categorias e políticas de acesso:
Membros públicos
Membros privados
Princípio do encapsulamento: aplicação aos TAD
Noção de condição invariante de classe (CIC): regras e vantagens
Exemplos com o TAD Racional, para concretização do conceito de número racional
Introdução à Programação
2003/2004