Buscar

classes em C++

Prévia do material em texto

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 1/1 
������������������������
Sintaxe: 
class [tag [: lista_de_bases ]] 
{ 
lista_de_ membros 
} [declaradores]; // similar à declaração de structs 
 
[ class ] tag declarators; // similar à declaração de dados intrínsecos 
Os elementos entre os simbolos [] são opcionais. Contudo o tag deve ser especificado se os 
declaradores não o forem (primeira forma). 
A palavra reservada class declara um tipo de classe (primeira forma) ou define um objeto de um tipo de 
classe (segunda forma). 
Os elementos de uma definição de classe são (sintaxe): 
tag 
Nome do tipo da classe. O tag passa a ser considerado uma palavra reservada no escopo de classes. 
lista_de_bases 
Especifica a classe (ou classes) a partir da qual (quais) esta é derivada (herança). Ou seja, especifica as suas 
classes base. Cada nome de classe base pode ser precedido por um especificador de acesso (public, private, 
protected) e da palavra reservada virtual. Consulte a Tabela de Privilégios de Acesso a Membros para 
obter mais informações. 
lista_de_ membros 
Declara membros ou “friends” da classe. Membros podem ser dados, funções, outras classes aninhadas, 
enums, campos de bits e nomes de tipos. “Friends” podem incluir funções ou classes. Não é permitia a 
inicialização explícita de dados. Um tipo classe não pode conter a sí mesmo como um membro não estático. 
Contudo, ele pode conter um ponteiro ou uma referência para sí mesmo. Consulte a palavra reservada 
virtual e a Tabela de Privilégios de Acesso a Membros para mais informações. 
declaradores 
Declaram um ou mais objetos desse tipo de classe. 
Exemplo 
No exemplo a seguir, a classe CAboutDlg é derivada a partir da classe base CDialog. A nova classes 
contem uma função membro, denominada CAboutDlg: 
class CAboutDlg : public CDialog 
{ 
public: 
 CAboutDlg(); 
 
 
protected: 
 virtual void DoDataExchange(CDataExchange* pDX); 
}; 
 
 
 
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 2/2 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
 
} 
����	
�
	��
��������	���
����	
�
	��
��������	���
����	
�
	��
��������	���
����	
�
	��
��������	���
����
public 
public: [lista_de_membros] 
public class_ base 
Quando este especifidador de acesso public precede uma lista de membros da classe, significa que esses 
membros podem ser acessados por qualquer função. Isto se aplica a todos os membros declarados após o 
especificador até o próximo especificador de acesso, ou até o final da classe. 
Quando a palavra reservada public precede o nome de uma classe base, significa que todos os membros 
public ou protected da classe base são também public ou protected da classe derivada, respectivamente. 
A forma de acesso padrão de membros de uma classe é private, enquanto que, o acesso padrão aos 
membros de um structure ou union é public. 
A forma de acesso padrão de uma classe base é private para classes e public para structures. Unions não 
podem ter classes base. 
Para mais informações, consulte private, protected, friend, e Tabela de Privilégios de Acesso a Membros. 
Exemplo 
class BaseClass 
{ 
public: 
 int pubFunc(); 
}; 
 
class DerivedClass : public BaseClass 
{ 
}; 
void main() 
{ 
 BaseClass aBase; 
 DerivedClass aDerived; 
 aBase.pubFunc(); // pubFunc() é acessível a partir de qualquer fuunção 
 aDerived.pubFunc(); // pubFunc() também é public na classe derivada 
} 
 
private 
 private: [lista_de_membros] 
private class_base 
 
 
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 3/3 
Quando o especifidador de acesso private precede uma lista de membros da classe, significa que esses 
membros podem ser acessados somente por funções membro da classe ou friends da classe. Isto se aplica a 
todos os membros declarados após o especificador até o próximo especificador de acesso, ou até o final da 
classe. 
Quando a palavra reservada private precede o nome de uma classe base, significa que todos os membros 
public ou protected da classe base são membros private da classe derivada. 
Para informações relacionadas a este tópico, consulte friend, public, protected, e Tabela de Privilégios de 
Acesso a Membros. 
Exemplo: 
class BaseClass 
{ public: 
 int pubFunc() { return privMem; } 
private: 
 // privMem accessivel somente a partir de funções membro da classe 
 void privMem; 
}; 
 
class DerivedClass : public BaseClass 
{ 
public: 
 void usePrivate( int i ) 
 { privMem = i; } // Erro: privMem não é acessível a partir da classe derivada 
}; 
 
class DerivedClass2 : private BaseClass 
{ 
public: 
 // pubFunc() da BaseClass é acessível a partir da classe derivada 
 int usePublic() { return pubFunc(); } 
}; 
 
void main() 
{ 
 BaseClass aBase; 
 DerivedClass aDerived; 
 DerivedClass2 aDerived2; 
 aBase.privMem = 1; // Erro: privMem não é acessível 
 aDerived.privMem = 1; // Erro: privMem não é acessível na classe derivada 
 
 aDerived2.pubFunc(); // Erro: pubFunc() é private na classe derivada 
} 
 
protected 
protected: [lista_de_ membros] 
protected class_base 
Quando o especifidador de acesso protected precede uma lista de membros da classe, significa que esses 
membros podem ser acessados somente por funções membro da classe ou friends da classe e por suas 
 
 
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 4/4 
classes derivadas. Isto se aplica a todos os membros declarados após o especificador até o próximo 
especificador de acesso, ou até o final da classe. 
Quando a palavra reservada protected precede o nome de uma classe base, significa que todos os membros 
public ou protected da classe base são membros protected da classe derivada. 
Para informações sobre os tópicos relacionados, consulte public, private, friend, e Tabela de Privilégios de 
Acesso a Membros. 
Exemplo 
class BaseClass 
{ 
protected: 
 int protectFunc(); 
}; 
 
class DerivedClass : public BaseClass 
{ 
public: 
 int useProtect() 
 { protectFunc(); } // protectFunc é acessivel a partir da classe derivada 
}; 
 
void main() 
{ 
BaseClass aBase; 
DerivedClass aDerived; 
 aBase.protectFunc(); // Erro: protectFunc não acessível 
 aDerived.protectFunc(); // Erro: protectFunc não acessível na classe derivada 
} 
 
 
��
�����
�����
�����
�������
����������������	�
���
���������������������
������
A palavra reservada friend (amiga) permite o acesso de uma função, ou de uma classe aos membros 
private e protected de uma outra classe. 
Consulte, também,���������	
�����������������
�������
 
Funções Friend 
Uma função friend é uma função que não é membro de uma classe mas tem acesso aos seus dados 
membros private e protected. 
Uma função friend é declarada pela classe que está permitindo o acesso. A declaração friend pode ser 
colocada em qualquer lugar na definição da classe. Ela não é afetada pela palavras reservadas de controle 
de acesso. 
 
 
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 5/5 
Exemplo 1 
Uma função friend é definida como uma função não membro. 
class Complex 
{ 
public: 
 Complex( float re, float im ); 
 friend Complex operator+( Complex first, Complex second); // esta função tem acesso direto aos dados 
 // membros da classe Complex 
private: 
 float real, imag; 
}; 
Exemplo 2 
Complex operator+( Complex first, Complex second ) 
{ 
 return Complex( first.real + second.real, 
 first.imag + second.imag ); 
} 
Neste exemplo, a função friend operator+ tem acesso aos dados membros privados dos objetos Complex 
que ela recebe como parametros. 
Note que a palavra reservada friend não aparece na definição da função. 
 
Classes Friend 
Uma classe friend é uma classe na qual todas as funções membro são funções friend de outra classe. Em 
outras palavras, as funções membro têm acesso aos dados membros de outra classe, mesmo que estes sejam 
private ou protected. 
Exemplo 
class SuaClasse 
{ 
friend class SuaOutraClasse; // Declara uma classe friend 
private: 
 int topSecret; 
}; 
 
class SuaOutraClasse 
{ 
public: 
 void change( SuaClasse yc ); 
}; 
 
void SuaOutraClasse::change( SuaClasse yc ) 
{ 
 yc.topSecret++; // acesso direto ao dado membro privado 
} 
A relação de amizado não é mutua, a menos que seja especificada explicitamente. No exemplo acima, 
funções membro da SuaClasse não podem acessar os dados membros privados de SuaOutraClasse. 
 
 
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 6/6 
A relação de amizade não é herdada, ou seja, classes derivadas de SuaOutraClasse não podem acessar os 
dados membros privados de SuaClasse. A relação também não é transitiva, ou seja, classes que são 
friends de SuaOutraClasse não podem acessar os dados membros privados de SuaClasse. 
������������
�
���
������	���
��������
�������������
�
���
������	���
��������
�������������
�
���
������	���
��������
�������������
�
���
������	���
��������
�����
 
 
Acesso na 
Classe Base 
Classe Base 
Herdada como: 
Acesso na 
Classe Derivada 
Public 
Protected 
Private 
Public Public 
Protected 
Sem acesso1 
Public 
Protected 
Private 
Protected Protected 
Protected 
Sem acesso 1 
Public 
Protected 
Private 
Private Private 
Private 
Sem acesso 1 
1
 A menos que declarações de acesso friend na classe base garante explicitamente o acesso.. 
 
�
������
������
������
���������
virtual declarador_funcao_membro 
virtual [especificador_acesso] nome_classe_base 
 
A palavra reservada virtual declara uma função virtual ou uma classe base virtual. 
Os elementos de uma declaração virtual são: 
declarador_funcao_membro 
Declara uma função membro. 
especificador_acesso 
Define o privilégio de acesso à classe base. Pode ocorrer antes ou após a palavra chave virtual. 
nome_classe_base 
Identifica um tipo de classe previamente declarada. 
Para mais informações, consulte Função Virtual, Funções Virtuais Puras e Abstratas, e Classe Base Virtual. 
 
 
 
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 7/7 
Função Virtual 
Uma função virtual é uma função membro que, se espera, será redefinida em classes derivadas. Quando nos 
referimos a um objeto de uma classe derivada usando um ponteiro ou uma referencia à classe base, 
podemos acionar uma função virtual para aquele objeto e executar a versão da função que corresponde à 
classe derivada. 
Exemplo 1 
class Empregado 
{ 
public: 
 virtual float calculePagamento(); 
}; 
 
class Vendedor : public Empregado // classe derivada de Empregado 
{ 
public: 
 float calculePagamento(); // função redefinida 
}; 
Diferentes versões da função calculePagamento( ) podem ser executadas, dependendo do tipo de objeto a 
partir do qual ela está sendo acionada. 
Exemplo 2 
Empregado umTrabalhador; 
Vendedor umVendedor; 
Empregado *p_empregado; 
 
p_empregado = &umTrabalhador; 
p_empregado->calculePagamento(); // executa Empregado::calculePagamento 
p_empregado = &umVendedor; 
p_empregado->calculePagamento(); // executal Vendedor::calculePagamento 
 
A palavra reservada virtual é necessária somente na declaração da função da classe base; Todas as 
declarações subsequentes em classes derivadas serão automaticamente virtuais. 
A versão da função virtual correspondente à classe derivada deve apresentar a mesma lista de parâmetros e 
tipo de retorno da função declarada na classe base. Se qualquer desses elementos for diferente, a função não 
é considerada uma redefinição de função virtual. 
 
Funções Virtuais Puras e Classes 
Abstratas 
Uma classe abstrata contem pelo menos uma função virtual pura. Uma função virtual pura é especificada 
igualando-a a 0 no final de sua declaração. Não é necessário fornecer a definição de uma função virtual 
pura. 
Não se pode declarar uma instância (ou seja, um objeto) de uma classe abstrata pura. Ela pode ser utilizada 
somente como uma classe base na definição de outras classes. 
 
 
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre 
Página 8/8 
Exemplo 
Neste programa, desenha() é uma função virtual pura, definida na classe abstrata Forma. Objetos Forma 
não podem ser declarados. Forma atua como uma classe base para Retangulo e Circulo. Retangulo e 
Circulo fornecem definições para desenha(), e instâncias dessas classes podem ser utilizadas. 
#include <iostream.h> 
 
class Forma 
{ 
public: 
 virtual void desenha() = 0; // declaração de uma função virtual pura. 
 // Portanto, a classe Forma é uma classe abstrata. 
}; 
 
class Retangulo: public Forma // Classe Retangulo é derivada da classe Forma (Herança) 
{ 
public: 
 void desenha(); 
}; 
 
class Circulo : public Forma // Classe Circulo é derivada da classe Forma (Herança) 
 
{ 
public: 
 void desenha(); 
}; 
 
Classe Base Virtual 
Classes Base virtuais oferecem um meio de economizar espaco e evitar ambiguidades em hierarquias de 
classe que utilizam herança múltipla. 
Cada objeto não virtual contem uma copia dos dados membros definidos na classe base. Esta duplicação 
This duplication desperdiça espaço e requer que sejam especificadas quais cópias dos membros da classe 
base são desejadas. 
Quando uma classe base é especificada como uma base virtual, ela pode atuar como uma base indireta mais 
do que uma vez sem duplicação de seus dados membros. Uma única cópia de seus dados membros é 
compartilhada por todas as classes base que a utilizam como base virtual. 
A palavra chave virtual é colocada na lista de bases das classes derivadas, e não a classe base.

Continue navegando