Ir para conteúdo
Fórum Script Brasil
  • 0

Construtores


Andersonjb

Pergunta

14 respostass a esta questão

Posts Recomendados

  • 0
Sera que alguém poderia me ajudar? O que são construtores e para que eles servem? Eles tem alguma coisa a ver com classes?

Sim, eles têm tudo haver com classes. Um construtor define o que um objeto fará (ou definirá) quando for inicializado (construído). Creio que você saiba o que é um objeto, mas mesmo assim vale lembrar que um objeto nada mais é do que uma instância (cópia) de uma classe que existirá por si só. Portanto, objetos terão membros (propriedades e métodos) que *podem* precisar serem inicializados. Nesse caso, o construtor é o maneira ideal de inicializá-los automaticamente. E existem ainda outros casos em que um construtor é muito útil (para definir objetos diferentes de acordo com os parâmetros passados).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, so tirandoalguma duvidas smile.gif Um objeto e uma variavel membro de uma classe, estou certo?Agoracomo assim um objeto e uma instancia de uma classe? E porque e uma copia dela? E construtor então seria uma função que "carrega" todas as configuraçoes de um objeto. e isso?

Link para o comentário
Compartilhar em outros sites

  • 0
Opa, so tirandoalguma duvidas smile.gif Um objeto e uma variavel membro de uma classe, estou certo?Agoracomo assim um objeto e uma instancia de uma classe? E porque e uma copia dela? E construtor então seria uma função que "carrega" todas as configuraçoes de um objeto. e isso?

Não, um objeto *não* é uma variável membro de uma classe. Uma variável membro da classe é que *pode* ser um objeto. Imagine uma classe Automóvel. A partir dessa classe é que criaremos os objetos Fiesta, Vectra, Ka, Astra, Gol, etc. Ou seja, um objeto chamado Fiesta é uma instância da classe (ele tem todas as características da classe, porém é como se fosse feita uma cópia dessas características só para esse objeto).

E sim, um construtor pode ter esse papel de carregar todas as "configurações" do objeto. Para ficar mais claro, decidi montar um exemplo de uma classe com dois contrutores. Sei que o modo como declarei a classe não está nos "conformes" da OO (as propriedades deveriam ser private e ter métodos para acessá-las) e nem do esquema de C++ (ou seja, criar um arquivo de cabeçalho para a classe)... mas é só um exemplo. tongue.gif

Você pode copiar e colar isso aí em um novo arquivo e compilar (usei o Dev-C++ aqui):

#include <stdlib.h>
#include <iostream>

using namespace std;

class Automovel {
      public:
          char *nome;
          int portas;
          double motor;
          char *cor;
          
          Automovel() {
                      this->nome = "sem nome";
                      this->portas = 0;
                      this->motor = 0.00;
                      this->cor = "sem cor";
          }

          Automovel(char *nome, int portas, double motor, char *cor) {
                      this->nome = nome;
                      this->portas = portas;
                      this->motor = motor;
                      this->cor = cor;
          }
};

int main() {
    // Objeto criado com o construtor SEM ARGUMENTOS
    Automovel *vectra = new Automovel();
    vectra->nome = "Vectra"; // Preenchimento dos atributos
    vectra->portas = 4;
    vectra->motor = 2.2;
    vectra->cor = "prata";
    
    // Objeto criado com o construtor que já preenche os atributos
    Automovel *fiesta = new Automovel("Fiesta", 2, 1.0, "amarelo");

    cout << vectra->nome << endl;
    cout << vectra->portas << endl;
    cout << vectra->motor << endl;
    cout << vectra->cor << endl;

    cout << fiesta->nome << endl;
    cout << fiesta->portas << endl;
    cout << fiesta->motor << endl;
    cout << fiesta->cor << endl;
    
    system("pause");
}

Note os dois contrutores (Automovel() e Automovel(...)) e repare os exemplos de criação de objetos utilizando cada um deles. Veja que o segundo (utilizado no objeto fiesta) é bem mais compacto e prático.

Certo? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

E ai, eu sei que eu sou meio chato, mas so resumindo... então um construtor so serve para mim definir as propriedades de um objeto? Por exemplo: se eu tenho um objeto VECTRA(); o construtor serve para mim inicializar as propriedades de vectra? E outra: você disse que um objeto e uma instancia de uma classe, mas como posso distinguir objetos de variaveis membros? E no seu exemplo: se eu definisse as carros como variaveis membros, não daria no mesmo?

Link para o comentário
Compartilhar em outros sites

  • 0

E ai, eu sei que eu sou meio chato, mas so resumindo...

Não, você não é "meio chato", apenas está com uma dúvida. wink.gif Isso é perfeitamente normal.

então um construtor so serve para mim definir as propriedades de um objeto? Por exemplo: se eu tenho um objeto VECTRA(); o construtor serve para mim inicializar as propriedades de vectra?

*Pode* servir para isso e não significa que *somente* faz isso. Você tem que imaginar um construtor como um método que é chamado *automaticamente* quando da criação de um objeto da classe. Um construtor, por exemplo, poderia abrir um arquivo em disco, se isso fosse necessário para a classe. E, também poderia fazer qualquer outra coisa. Todavia, o uso mais comum é justamente esse que exemplifiquei (definir as propriedades de um objeto durante a sua criação).

E outra: você disse que um objeto e uma instancia de uma classe, mas como posso distinguir objetos de variaveis membros? E no seu exemplo: se eu definisse as carros como variaveis membros, não daria no mesmo?

Não entendi... o que você compreende por "variáveis membros"? Que eu saiba, uma "variável membro" é a mesma coisa que um "atributo" (ou uma "propriedade", ou ainda uma "variável de classe" ou uma "variável de instância"... êta negócio pra ter nome... tongue.gif). No caso ali acima, 'nome', 'portas', 'motor' e 'cor' são "variáveis membros" (ou "propriedades", ou "atributos", ou "variáveis de instância") da classe "Automovel".

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

E ai, graymalkin, beleza? Valeu pela resposta, entendi tudinho, rolleyes.gif , você e muito bom, cara, mas so resotu uma duvidazinha: O que o objeto numa classe então? A classe e o objeto em si, ou os registros da classe são objetos, por exemplo:

class Automovel

{

int marca;

}Fiesta;

então o Fiesta seria o objeto?

Link para o comentário
Compartilhar em outros sites

  • 0
mas so resotu uma duvidazinha: O que o objeto numa classe então?

Você pode pensar na classe como a definição e no objeto como a concretização real da definição. No caso ali, "Automovel" é a classe. Mas, qual "Automovel" é esse? O que ele tem? Qual a sua cor? Qual o seu motor? Quantas portas ele tem? Não se sabe, mas sabe-se que *todo* "Automovel" vai ter isso (ou seja, isso está definido na classe). É nos objetos (fiesta e vectra) que vemos a concretização dessa definição, já que eles possuem os atributos preenchidos com seus respectivos valores (sabemos que fiesta é um automóvel Fiesta, amarelo, com motor 1.0 e duas portas; e que vectra é um automóvel Vectra, prata, com motor 2.2 e quatro portas).

Uma classe é um modelo, enquanto que um objeto é algo real criado a partir do modelo (ou seja, da classe). Note que a classe é sempre algo mais abrangente (Automóvel, Pessoa, Animal, Equipamento, Cliente, Fornecedor, etc.), enquanto que o objeto é particular (fiesta, vectra, junior, anderson, gato, girafa, teclado, monitor, cliente1, cliente2, empresa1, empresa2, etc.).

Ah, antes que alguém se manifeste, nomes de classes são com a primeira letra maiúscula (Pessoa) enquanto que objetos são descritos com todas as letras minúsculas (junior). Isso *não* é obrigatório, mas é uma convenção que ajuda a distinguir classes e objetos (ou seja, é uma boa prática de programação). E meu "Automovel" não tem acento porque o código em C++ não admite (e por isso que coloco entre aspas aqui).

Certo? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Ah, ta, agora ficou tudo mais claro.. E já aproveitando que o assunto ta muito bom, hehehe, o que é secão de inicialização e pra que serve? huh.gif

"Seção de inicialização"? Acho que nunca me deparei com esse termo (a não ser que eu conheça um outro equivalente e não saiba). Em qual contexto você viu isso? Foi em alguma referência bibliográfica?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, eu to estudando pelo c++ absoluto, já ouviu falar? assim, o codigo a que se refere e esse aqui:

DiadoAno(classe)::DiadoAno(int valordia, int valormes)(//*Construtor*//)

::dia(valordia), mes(valormes)

já viu esse negocio? eu já vi ele ate no C++ Builder, mas não consegui entender... você sabe o que e?

Link para o comentário
Compartilhar em outros sites

  • 0
Opa, eu to estudando pelo c++ absoluto, já ouviu falar? assim, o codigo a que se refere e esse aqui:

DiadoAno(classe)::DiadoAno(int valordia, int valormes)(//*Construtor*//)

::dia(valordia), mes(valormes)

já viu esse negocio? eu já vi ele ate no C++ Builder, mas não consegui entender... você sabe o que e?

O código está escrito assim mesmo? Bom, um código parecido com esse aí é utilizado quando se vai definir a implementação de um método. Exemplo:

tipo_retorno Classe::método(parâmetros) {
  // código;
}
Ou, se for um construtor (como é o caso):
Classe::método_construtor(parâmetros) {
  // código;
}

Agora aquela "(classe)" ali é que acho que nunca vi desse jeito.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

E ai, graymalkin, eu consegui entender o que é! Por exemplo, olha este codigo:

DiadoAno::DiadoAno(int valordia, int valormes)

::dia(valordia), mes(valormes)

{

if((dia<1) || (dia>31))

{

cout<<"Valor de dia ilegal!";

exit(1);

}

if((mes<1) || (mes>12))

{

cout<<"Valor de mes ilegal!";

exit(1);

}

}

O setor de inicialização inicia os parametros de acordo com a necessidade do usuario, nesse codigo acima ele não deixa o usuario digitar um numero invalido no construtor!

Entendeu como que e? Hehehe, como e bom estudar!!! Valeu, ate a proxima, hein!

Link para o comentário
Compartilhar em outros sites

  • 0

E ai, graymalkin, eu consegui entender o que é! Por exemplo, olha este codigo:

DiadoAno::DiadoAno(int valordia, int valormes)

Ah, agora sim está escrito do modo correto.

O setor de inicialização inicia os parametros de acordo com a necessidade do usuario, nesse codigo acima ele não deixa o usuario digitar um numero invalido no construtor!

Entendeu como que e? Hehehe, como e bom estudar!!! Valeu, ate a proxima, hein!

Sim, essa também *pode* ser uma tarefa do construtor, ou seja, validar os dados inseridos.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...