Programar em C++/Classes: diferenças entre revisões

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
Sem resumo de edição
Linha 52:
</source>
 
Agora temos assegurados métodos de inclusão e acesso a dados da matriz de caracteres, porém ainda existe um pequeno problema: Quem quiser o antigo método de acesso direto conseguirá facilmente, pois os elementos da estuturaestrutura estão acessíveis publicamente por padrão.
 
=== Conceituação ===
Linha 112:
 
 
* Mudamos o identificador de '''struct''' para '''class'''
* Mas se tentarmos compilar o programa isto vai causar erros de compilação, porque agora temos variáveis membro que são privadas por padrão, estas não são vistas por funções fora da classe.
 
 
Dentro de uma classe podemos definir diversos modos de visibilidade de variáveis e funções.
Linha 288 ⟶ 287:
|}
 
Podemos, então, entender os objetos como blocos de dados que têm propriedades (variáveis) e que podem fazer algo (métodos). Então, criamos todas as funcionalidades que precisamos que a classe forneça aos programas, fazendo os testes necessários para assegurar sua consistência e establidadeestabilidade. Sempre que precisemos utilizar os objetos só temos que instanciá-los (declará-los), e não precisamos nos preocupar como eles funcionam internamente, uma vez que os desenhamos adequadamente.
 
Para entendermos melhor este conceito podemos fazer uma analogia. Consideremos um objeto resistência: sabemos que temos de usá-lo e que ela deve ter certas características, então teremos o seu valor em Ohms, sua potência máxima, tolerância, entre outras, e teremos uma função que nos dará a corrente que passa por ela quando lhe aplicamos uma tensão elétrica. Não precisamos saber de que é que ela é feita, ou como estas características internas a faz funcionar, basta-nos receber os resultados.
Linha 294 ⟶ 293:
Vejamos o exemplo:
 
Agora vamos mostrar que podemos ter funções membro apenas como protótipos e defini-las fora da classe. Para isso usamos o operador de definição de escopo '''::''' que permite definir o local do código onde um identificador existe, no formato: '''''ESCOPO::função''''' ou '''''ESCOPO::dado'''''. De maneira geral, quando declaramos identificadores dentro da classe podemos definídefini-los no escopo global referenciando estes pelo operador de escopo.
 
<source lang=cpp>
Linha 319 ⟶ 318:
int main ()
{
CRectangle rect; //definimos objectoobjeto de classe
rect.set_values (3,4); //objectoobjeto-membro
cout << "area: " << rect.area();
system (“pause”);
Linha 344 ⟶ 343:
int main ()
{
CRectangle rect; //definimos objectoobjeto de classe
rect.set_values (3,4); //objectoobjeto-membro
cout << "area: " << rect.area();
system ("pause");
Linha 455 ⟶ 454:
O encapsulamento visa, primariamente duas metas:
# Eliminar a necessidade de conhecimento da estrutura interna por quem deseja usá-la. Por exemplo, se os objetos precisam manter um conjunto de 4 bytes, isto pode ser conseguido usando-se duas variáveis '''short int''', uma '''int''', um vetor com 4 characteres, ou a variação de qualquer um dos anteriores sem sinal, mas estes detalhes não precisam estar expostos.
# Se a representação interna dos dados for modificada, desde que asos tipologiastipos de retorno e de parâmetros das funções públicas mantenham-se inalteradas, não necessitemos de alterar código que utilizem objetos da classe.
 
Ou seja, o encapsulamento simplifica a programação escondendo as particulariadades da classe e elimina o retrabalho do código por alterações da mesma. Geralmente as funções (métodos) privadas, são auxiliares a outras funções da classe.
Linha 463 ⟶ 462:
 
Há dois métodos para definir as funções membro:
* Eles podem ser definidos dentro da classe, o que é apropriado para funções pequenas;
* E funções grandes podem ser definidas fora da classe.
Neste caso terão de ser identificadas como pertencentes à classe e para isso utilizamos o operador de resolução de escopo “'''::'''”.
 
Linha 479 ⟶ 478:
As principais características dos construtores são:
 
*Não têm qualquer tipologiavalor de retorno;
*Não podem ser executados por chamada explícita no código;
*São executados logo depois que os tipos básicos do objeto foram criados;
Linha 527 ⟶ 526:
 
O destrutor tem as seguintes características:
* O destrutor é chamado quando o objeto está sendo finalizado;
* É usado para libertarliberar qualquer memória que tenha sido alocada;
=== Declaração ===
Linha 563 ⟶ 562:
</source>
 
Repare que o :
* Construtor O construtor tem o mesmo nome que a classe;
* O destrutor tem o mesmo nome que a classe com o prefixo de tilde” ~”;
* O construtor foi usado para inicializar as variáveis membro, mas noutros exemplos poderia alocar memória, tomar controle de recursos como dispositivos de sistema e executar inicializações de código;
* O destrutor no exemplo não faz nenhuma ação real, para além de fazer o eco informando que foi chamado.
 
== "copy constructors" ==
 
Um "copy constructor" é um construtor especial que toma como argumento a referência de um objeto da mesma classe e cria um novo objeto que é a copia do objeto em referência. Por padrão, o compilador providencia um "copy constructor" que faz a cópia membro por membro do objeto original, construindo um objeto idêntico. Isto é chamado de "shallow copy" ou "member wise".
 
.
Em algumas situações a cópia de um objeto não é satisfatória, para ver isso vamos ver a classe employee, abaixo: