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

(Resolvido) Atribuição de objetos em C++


Castro

Pergunta

:rolleyes:

Considere a citação e o programa abaixo:

“Se ambos os objetos são do mesmo tipo (ou seja, ambos são objeto da mesma classe), então um objeto pode ser atribuído a outro. Não é suficiente para as duas classes ser fisicamente similares – seus nomes de tipo devem ser os mesmos. Por default, quando um objeto é atribuído a outro,uma cópia de modo de bit dos dados do primeiro objeto é atribuído ao segundo. Assim, após a atribuição, os dois objetos serão idênticos, mas separados” – ( C++ guia para iniciantes,Schild)

// atribuindo objetos

#include <iostream>
using namespace std;

class test
{
   int a,b;
   
   public:
          void setab(int i,int j){a=i,b=j;}
          void showab()
          {
               cout << "a e " << a << "\n";
               cout << "b e " << b << "\n";
          }
   
};

class test2
{
   int a,b;
   
   public:
          void setab2(int i,int j){a=i*2,b=j*2;}
          void showab2()
          {
               cout << "a e " << a << "\n";
               cout << "b e " << b << "\n";
          }
       };

int main()
{
    test ob1, ob2;
    
    ob1.setab(10,20);
    ob2.setab(0,0);
    
    cout << "ob1 antes da designacao: \n\n";
    ob1.showab();
    
    cout << "\nob2 antes da designacao:\n";
    ob2.showab();
    cout << "\n";
    
    ob2 = ob1; // atribui ob1 a ob2
    
    cout << "\nob1 depois da designacao:\n";
    ob1.showab();
    cout << "\nob2 depois da designacao:\n";
    ob2.showab();
    cout << "\n";
    
    ob1.setab(-1,-1); // modifique ob1
    
    cout << "\nob1 depois da mudanca de ob1:\n";
    ob1.showab();
    cout << "\nob2 depois da mudanca de ob1:\n";
    ob2.showab();
    
    test2 ob3;
    
    ob3.setab2(30,40);
    cout << "\nob3 antes da mudanca:\n";
    ob3.showab2();
    cout << "\nob1 depois da mudanca de ob3:\n";
    
    ob1=ob3;
    ob1.showab();
    system ("pause");
return 0;
}
1- Lendo o texto acima, pode-se deduzir, que se os objetos de classes diferentes podem ser atribuídos. Entretanto, o programa apresenta erro caindo na linha
ob1=ob3;

erros:

D:\Sobre_C++\Livro C++guia para iniciantes\atribuicao_de_objetos.cpp In function `int main()':

69 D:\Sobre_C++\Livro C++guia para iniciantes\atribuicao_de_objetos.cpp no match for 'operator=' in 'ob1 = ob3'

note D:\Sobre_C++\Livro C++guia para iniciantes\atribuicao_de_objetos.cpp:7 candidates are: test& test::operator=(const test&)

Pergunto: as funções e atributos das duas classes não praticamente idênticos ? só muna o nome das funções e o parâmetros são multiplicados na classe test2. O tipo de objetos não permanece o mesmo ?

2- Se eu só puder atribuir objetos dentro de uma mesma classe, qual seria a vantagem desse recurso ?

Obvrigado

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0
1- Lendo o texto acima, pode-se deduzir, que se os objetos de classes diferentes podem ser atribuídos. Entretanto, o programa apresenta erro caindo na linha

não pode-se não... o q ele diz é q dois objetos diferentes da mesma classe pode ser atriubuidos. mas da mesma classe.

não importa o quanto duas classes forem parecidas, so da certo se forem dois objetos da mesma classe.

2- Se eu só puder atribuir objetos dentro de uma mesma classe, qual seria a vantagem desse recurso ?

não entendi direito sua pergunta. a vantagem é q você pode fazer uma copia dele caso precise por qualquer motivo.

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0

Explicitamente você não precisa (nem pode) executar o destrutor da classe. Ele será chamado automaticamente pelo compilador em duas situações distintas: se para o objeto foi alocada memória pelo comando new, você deve liberar a memória depois do uso, pela execução do comando delete. Isso chamará o destrutor. A segunda situação é quando o objeto é uma variável local. Aí é mais fácil ainda: o destrutor será chamado automaticamente quando o escopo do objeto morrer, esteja ele dentro do bloco da função ou dentro de um bloco mais interno ao bloco principal.

Link para o comentário
Compartilhar em outros sites

  • 0

:mellow:

Se entendi bem, só o que tenho que fazer com relação ao destrutor é

class nome_classe
{
  ~destrutor();
.
.
.
}

nome_classe::destrutor()
{

   vrarriável="valor";
}
Nunca fazer
int main()
{
  ~destrutor // ERRADO

}

e chamar o construtor em main(), é correto ?

Fiz um programa em que inicializei as variáveis nos contrutores, mas pude usar as variáveis sem chamar o contrutor em main()

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0
e chamar o construtor em main(), é correto ?

exatamente. O construtor é chamado automaticamente ao instanciar a classe.

Fiz um programa em que inicializei as variáveis nos contrutores, mas pude usar as variáveis sem chamar o contrutor em main()

Se as variáveis são externas à classe você pode usá-las do jeito que quiser. Mas se estas forem propriedades da classe, elas só existem dentro do escopo do objeto. Ou seja, enquanto ele existir.

Link para o comentário
Compartilhar em outros sites

  • 0

:)

Ok.

Implemntar um destrutor não é redundante, já que quando o programa temina as variáveis são destridas ?

exemplo:

class pessoa
{

    int vet[10];
    public:
             pessoa();
             ~pessoa();
};

pessoa::~pessoa()
{
 cout << "vetor limpo";
};
ou seria melhor fazer isto:
pessoa::~pessoa()
{
   for (i=0; i<=10; i++)
   vet[i];
};

Ps: tenho um tópico "Duvidas sobre construtotres"

Obrigado

Editado por Castro
Link para o comentário
Compartilhar em outros sites

  • 0
Implemntar um destrutor não é redundante, já que quando o programa temina as variáveis são destridas ?

Absolutamente. Se fosse redundante o recurso não existiria. Imagine a cena: você instancia a classe e o construtor é executado. Nele, uma porção de memória é alocada. Como se faria a liberação automática dessa memória, senão no destrutor? Aliás, a principal função do destrutor é exatamente essa: limpar o "rastro" do objeto. Você insere o código pertinente à essa função nele e mantém a classe trabalhando apenas no que realmente interessa. Ajuda demais na organização.

quando o programa temina as variáveis são destridas ?

Esqueci de comentar isso.

Realmente, finado o escopo das variáveis, estas são automaticamente destruídas. Mas isso não vale para memória alocada. Pra "matar" isso e devolver a memória, só mesmo com uma liberação explícita. Tarefa feita no destrutor, normalmente.

Link para o comentário
Compartilhar em outros sites

  • 0

:rolleyes:

Quero fazer um programa, que seja um pequeno cadastro. para isso, gostasria de saber como escrever o destrutor ao fim do programa.

No caso do meu post de 12/04, quero saber a forma mais correta de finalizar um veto. Se preciso fercorre o vetor num for para destri-lo, ou basta chamar o construtor vazio para finalizr o vetor ou qualquer outra variável.

Entendi, que para alocação de memória isto tem que serexplicitado no destrutor, mas e variáveis de um modo geral ?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0
Entendi, que para alocação de memória isto tem que serexplicitado no destrutor, mas e variáveis de um modo geral ?

Observe alguns detalhes importantes. Variáveis comuns são automaticamente descartadas quando morrer o escopo destas. Um exemplo, em termos bem miúdos: dentro de um bloco de código você cria uma variável (sem alocação de memória, note). Ao sair deste bloco a variável deixa de existir. É automático. Nem se preocupe com ela.

No caso da variável conter um ponteiro para memória alocada, a liberação desta memória deve ser feita explicitamente. O usual é que no início da função você aloque a memória necessária e, antes do retorno da função, libere o espaço alocado.

Quando, por algum motivo, você alocar memória no construtor da classe, é normal que o destrutor tenha código para liberar essa memória. Também pra isso serve o destrutor. Mas, via de regra, a finalidade do destrutor é executar procedimentos necessários à pré-morte do objeto. Se você não tem nada do tipo a executar, esqueça.

Link para o comentário
Compartilhar em outros sites

  • 0

:)

Ok. entendi. Resumindo: se não aloquei memória no construtor, e usar variáveis comumente, então poderei usar o destrutor vazio, caso aloque memória no construtor terei que libera-la no no destrutor. Se vocês não tiverem mais considerações a fazer, darei este tópico como fechado.

Obrigado

Ps. Tenho alguns outros tópicos se vocês puderem ajudar..

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