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

Duvidas sobre construtor


Castro

Pergunta

:rolleyes:

Estou iniciando aqui um estudo sobre construtores. Considere o programa e seus comentários, pois deles tirarei as perguntas. Os comentários são tirados do livro “C++ guia para iniciantes –Sdhild. Espero que minhas dúvidas sejam úteis para outros...

Neste tópico também colocarei algumas dúvidas sobre funções que se relacionarem com os programas. Considere o primeiro programa:

#include <iostream>
using namespace std;

class classe
{
      int valor;
      public:
             classe (int i)
             {
              valor=i;
              cout << "Dentro do construtor:\n";
             }
         ~classe() {cout << "Destuindo:\n";}    
             
      int pegavalor() {return valor;}
      
};

void display (classe obj)
{
     cout << obj.pegavalor() << "\n";
}

     int main()
     {
         
     classe a(10); 
         
     cout << "valor ´a´ antes da chamada de display() ";
     
     display(a);
         
     cout << "Valor de ´a´ depois de display() retornar ";
     display(a);
     system ("pause");
     return 0;
}


/* Como você pode ver, há uma chamada para o construtor (que ocorre
quando "a" é criado), mas há duas chamadas para o destrutor. Vamos ver
 porque este é o caso.

 Quando um objeto é passado para uma função, uma cópia daquele objeto é
 feita,(e esta cópia se torna o parâmetro da função). Isto siguinifica
 que um novo objeto passa há existir.Quando a função termina, a cópia
 do argumento (ou seja, o parâmetro) é destruida. Isto levanta duas per-
 guntas fundamentais: primeiro, o construtor do objeto é chamado quando
 a cópia é feita ? segundo, o destrutor do objeto é chamado quando a 
 cópia é destruida ? as respostas a principio, surpreender você.

 Quando uma cópia de um argumento é feita durante uma chamada de função,
 o construtor normal não é chamado. Ao invés disto o construtor , o 
 costrutor de cópia do objeto é chamado. Um construtor de cópia define
 como uma cópia de um objeto é feita. (...) No entanto, se uma classe
 não definir explicitamente um construtor de cópia, então C++ fornece um
 por default. O construtor de cópia default cria uma cópia de modo de
 bit (ou seja identica) do objeto. A razão pela qual uma cópia de modo
 de bit é feita é fácil de entender se você pensar a respeito. Como um
 construtor normal é usado para inicializar algum aspecto de um objeto, ele
 não deve ser chamado para fazer  uma cópia de um objeto já
 existente. Tal chamada alteraria o conteúdo do objeto. Ao passar
 um objeto para uma função, você quer usar o estado atual do objeto, não
 seu estado inicial. 

No entanto,quando a função termina e a cópia do objeto usada como um
argumento é destruída, a função destrutor é chamada. Isto é necessário
porque o objeto saiu do escopo.É por isso que  o programa anterior
tinha duas chamadas para o destruidor. A primeira foi quando o
parâmetro para display() saiu do escopo. A segunda foi quando "a" dentro
de main() foi destruída quando o programa terminou */
1 – Considerando,que ouve uma segunda chamada de construtor/destrutor defult, isso não explica como o construtor criado, foi ativado, pois dentro de main() não há nenhuma chamada tipo:
classe();
ou
~classe();
Como então construtores são ativados, independente de serem de cópia ? basta defini-los dentro da classe ? 2- Se eu defini-los como uma função de classe, ou seja,
classe:: classe()
{
    var1=valor1;
    var2=valor2;
};
e usar essas variáveis inicializadas no construtor, poderei usar diretamente em main(), sem precisar chamar o construtor. Pergunto: no caso de construtores como esse, que não são parametrizados, precisa de destrutor ? 3 – Considerando, que o construtor não é parametrizado, para ele destruir os objetos bastaria chamar o construtor vazio ou se deve mencionar as variáveis de alguma forma no destrutor ? 4- No programa acima, há funções como display(), que foram definidas fora da classe, e antes da função main(), percebi, que estas funções não precisam ter o protótipo citado, notei, que se eu declarar o protótipo antes do include, tipo:
void display (classe obj);

No programa acima, dará erro. Por que ? se estou informando o protótipo e o mesmo não está definido na classe. .

5- O curioso, é que se eu definir essa função abaixo de main(), com protótipo antes do include, e sem relaciona -las a classe, também dará erro. Por quê ? não teria que seguir as regras de C ?

6- O fato de display() não estar prototipada na classe, e ter sido implementada fora dela, indica que display() não é função membro, correto ?

Obrigado

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...