Operatore di assegnamento

di il
6 risposte

Operatore di assegnamento

Dato il seguente codice:

#include <string.h>
class stringa
{
   char* str;
public:
   stringa(const char s[]);        // costruttore
   ~stringa();                          // distruttore
   stringa(const stringa& s);   // costruttore di copia
   //   ...
};

stringa::stringa(const char s[])
{
   str=new char[strlen(s)+1];
   strcpy(str, s);
}
stringa::~stringa()
{
   delete [] str;
}
stringa:stringa(const stringa& s)
{
   str=new char[strlen(s.str)+1];
   strcpy(str, s.str);
}

void fun()
{
   stringa s1("vino"), s2("birra");
   s1=s2;
}
non capisco perché nella riga di codice "s1=s2" NON interviene il costruttore di copia ma bensì l'operatore di assegnamento default che fa una copia del contenuto del puntatore str di s1 in quello di s2.
Forse perché il costruttore di copia interviene solo se presente un'inizializzazione? Nel nostro caso l'oggetto è stato creato prima quindi si parla di assegnamento. E' corretta la mia interpretazione?

6 Risposte

  • Re: Operatore di assegnamento

    Aggiungo un'altra domanda, se avessi avuto nel main() il seguente codice avrei potuto parlare di costruttore di copia, corretto?
    stringa c1=c2
    funzione(c1)    // c1 è passato per valore ed è di tipo stringa
    Stessa situazione se nel main aggiungessi questa funzione:
    stringa ff()
    {
       stringa sg("acqua");
       return sg;
    }
    cioè quando viene eseguita l'ultima istruzione (return) viene anche invocato il costruttore di copia.

    Vorrei avere conferma se ciò che dico è corretto e vi chiedo supporto:
    al costruttore di copia viene passato l'oggetto di tipo const stringa come riferimento e
    nel primo caso (c1=c2) viene passato il parametro c2,
    nel secondo caso viene passato il parametro c1 (per la copia nel parametro formale)
    nel terzo caso viene passato il parametro sg.

    Giusto?

    Grazie
  • Re: Operatore di assegnamento

    ... che fa una copia del contenuto del puntatore str di s1 in quello di s2.
    In realtà è il contrario.
    Forse perché il costruttore di copia interviene solo se presente un'inizializzazione? Nel nostro caso l'oggetto è stato creato prima quindi si parla di assegnamento. E' corretta la mia interpretazione?
    Esatto.
    Va precisato cmq che oltre all'inizializzazione, il costruttore di copia viene invocato anche nel passaggio by value di un argomento a una funzione e nella restituzione by value del valore di ritorno di una funzione. Quindi la risposta a tutte le domande fatte nel secondo post è si.

    Per la cronaca le seguenti righe di codice sono equivalenti:
    stringa c1 = c2;
    stringa c1(c2);
    stringa c1 = stringa(c2);
    Una precisazione, nei prototipi dei metodi i nomi degli argomenti non servono.


    Approfitto del topic per fare anche io una domanda.
    Considerando il funzionamento dell'operatore di assegnamento di default, come mai il seguente codice stampa

    indirizzo_obj_1 - indirizzo_obj_2
    indirizzo_obj_1 - indirizzo_obj_2

    e non

    indirizzo_obj_1 - indirizzo_obj_2
    indirizzo_str_2 - indirizzo_str_2

    ?
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    class stringa
    {
    public:
       char *str;
       stringa(const char*);
       ~stringa();
    };
    
    stringa::stringa(const char *s)
    {
        str = new char[strlen(s) + 1];
        strcpy(str, s);
    }
    
    stringa::~stringa()
    {
       delete[] str;
    }
    
    int main()
    {
        stringa s1("vino");
        stringa s2("birra");
        s1 = s2;
        cout << &s1     << " - " << &s2 << endl;
        cout << &s1.str << " - " << &s2.str;
    }
    
  • Re: Operatore di assegnamento

    Nippolo ha scritto:


    ... che fa una copia del contenuto del puntatore str di s1 in quello di s2.
    In realtà è il contrario.
    Piccola distrazione!
  • Re: Operatore di assegnamento

    Su questo aspetto invece chi mi sa rispondere se ho detto assurdità?
    Vorrei avere conferma se ciò che dico è corretto e vi chiedo supporto:
    al costruttore di copia viene passato l'oggetto di tipo const stringa come riferimento e
    nel primo caso (c1=c2) viene passato il parametro c2,
    nel secondo caso viene passato il parametro c1 (per la copia nel parametro formale)
    nel terzo caso viene passato il parametro sg.
  • Re: Operatore di assegnamento

    Nippolo ha scritto:


    Quindi la risposta a tutte le domande fatte nel secondo post è si.
  • Re: Operatore di assegnamento

    Nippolo ha scritto:


    Approfitto del topic per fare anche io una domanda.
    Considerando il funzionamento dell'operatore di assegnamento di default, come mai il seguente codice stampa

    indirizzo_obj_1 - indirizzo_obj_2
    indirizzo_obj_1 - indirizzo_obj_2

    e non

    indirizzo_obj_1 - indirizzo_obj_2
    indirizzo_str_2 - indirizzo_str_2

    ?
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    class stringa
    {
    public:
       char *str;
       stringa(const char*);
       ~stringa();
    };
    
    stringa::stringa(const char *s)
    {
        str = new char[strlen(s) + 1];
        strcpy(str, s);
    }
    
    stringa::~stringa()
    {
       delete[] str;
    }
    
    int main()
    {
        stringa s1("vino");
        stringa s2("birra");
        s1 = s2;
        cout << &s1     << " - " << &s2 << endl;
        cout << &s1.str << " - " << &s2.str;
    }
    
    Qualcuno saprebbe chiarirmi questo dubbio?
Devi accedere o registrarti per scrivere nel forum
6 risposte