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

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
Movido do livro de C
Abacaxi (discussão | contribs)
Sem resumo de edição
Linha 83:
Este simples detalhe revela uma característica importante das estruturas em C++: Nesta linguagem as estruturas são tratadas como tipos primitivos de objetos. Elas têm características semelhantes às classes, que veremos nos capítulos subsequentes.
 
As estruturas em C++ também podem conter funções além de dados. Este fato vem da idéiaideia de modelo de objeto que as estruturas mantém nesta linguagem. Objetos devem ter propriedades (variáveis) e métodos (funções membro), por isso temos a possibilidade de criar funções dentro do corpo das estruturas, com a finalidade de lidar com os dados que elas mantém.
 
== Construtores ==
Os construtores são funções que são criadas automaticamente sempre que tentamos criar um objeto. Eles funcionam da mesma maneira que construtores de classe. A esses que são criados automaticamente são os chamados de defaut.
 
Se escrevermos o código:
<source lang="cpp">
<pre>
#include <iostream>
#include <string>
using namespace std;
const int MAX = 3;
 
&nbsp;
struct Person
{
Linha 100:
int height;
};
 
&nbsp;
int main ()
{
Linha 108:
return 0;
}
</presource>
 
O resultado é:
The person's name is and height is -858993460
 
Aqui é criado um defaut constructor no momento em que criamos a instanciainstância p1 ie com a linha Person p1;
 
Como as variáveis membro não foram iniciadas, o valor de name está vazio e o na variável height está um valor qualquer – que é lixo!
Linha 119:
;Constructor sem argumentos
 
Podemos ter um constructorconstrutor sem argumentos que ao contrário do defaut constructor designa valores defaut ásàs variáveis membro.
<source lang="cpp">
<pre>
struct Person
{
string name;
int height;
Person() //constructorconstrutor sem argumentos
{
name = "No name assigned";
Linha 131:
}
};
</presource>
 
*O nome do constructorconstrutor é sempre igual ao nome da estrutura, sem excepçãoexceção.
*O constructorconstrutor não retorna qualquer valor, sem excepçãoexceção
 
Refazendo o nosso exemplo
<source lang="cpp">
<pre>
#include <iostream>
#include <string>
Linha 158:
return 0;
}
</presource>
 
Repare que demos valores defaut ás variáveis. Agora não estamos no caso de ter p1.name=???
Linha 167:
Termos um constructor sem argumentos é um melhoramento face ao defaut constructor pois agora temos valores defaut para as variáveis membro.
Porém seria melhor se conseguíssemos inicializar as variáveis membro com valores dados pelo utilizador enquanto o programa estivesse e a correr. E realmente podemos fazer se passarmos argumentos.
<source lang="cpp">
<pre>
#include <iostream>
#include <string>
using namespace std;
const int MAX = 3;
struct Person
{
{
string name;
int height;
Linha 187 ⟶ 188:
}
};
&nbsp;
int main ()
{
Linha 202 ⟶ 203:
return 0;
}
</presource>
 
Repare que os argumentos do construtor têm de estar na ordem esperada
 
;Separar o constructorconstrutor prototype da implementação
<source lang="cpp">
<pre>
#include <iostream>
#include <string>
Linha 217 ⟶ 218:
int height;
Person(); //constructorconstrutor sem argumento
Person(string, int); //constructorconstrutor com dois parametrosparâmetros, apenas é necessário dizer ao tipologiatipo dos parâmetros – o nome não é necessário)
};
Linha 247 ⟶ 248:
return 0;
}
</presource>
 
* Vamos ver a função main(): declarámos 2 variáveis uma int e outra string. Pedimos para a pessoa escrever o nome e colocámos o valor na variável string, depois pedimos a altura e colocámos na variável int. Depois chamámos o constructorconstrutor com dois argumentos e passamos as variáveis anteriores como argumentos. Por fim mandámos imprimir no ecrã os valores das variáveis membro da estrutura.
* Repare que para definirmos fora o construtor recorremos ao operador scope ::
<source lang="cpp">
<pre>
Person::Person()
Person::Person(string s, int h)
</presource>
* Repare que no prototype dos constructorconstrutor apenas tivemos de dizer ao tipologiatipo dos parâmetros