Qual è lo scopo della creazione di una funzione membro con lo stesso tipo della sua classe?

2

Sono sicuro che avrò un pò di termini specifici, ma qual è la differenza tra object e object2 in questa implementazione? L'unico scopo del primo metodo (prototipazione della funzione della classe con lo stesso nome della classe) è solo per risparmiare la digitazione? Alla fine del codice, fa object==object2 ?

//first method
class Class1{
public:
        int i;
        Class1 (parameter);
};
Class1::Class1 (parameter){
        i = 10;
}
Class1 object1(parameter);

//second method
class Class2{
public:
        int i;
        void function (parameter);
};
Class2::function (parameter){
        i = 10;
}
Class2 object2;
object2.function(parameter);

(C ++ 11)

    
posta carlbently 20.10.2014 - 18:40
fonte

2 risposte

3

Class1 e Class2 dovrebbero essere qualcosa del tipo:

class Class1 {
public:
  int i;
  Class1(int parameter) : i(parameter) {}  // This is a constructor
};

class Class2 {
public:
  int i;
  void function(int parameter) {i = parameter;} // This is a init function
};

e

Class1 object1(10);
Class2 object2;
object2.function(10);

Il valore di i sarà lo stesso: object1.i == object2.i ma lo scopo del costruttore NON è quello di salvare la digitazione.

  • come Joel ha dichiarato in un commento , con il costruttore è obbligatorio assegna un valore a i , mentre con la funzione init puoi usare i senza un precedente incarico esplicito.

    Nel codice OO opportunamente progettato, il costruttore è responsabile di stabilire gli invarianti di classe (qui i dovrebbe essere un membro dati privato). Senza un costruttore, ogni utilizzo della classe deve prima assicurarsi che l'oggetto sia stato costruito correttamente.

    Non puoi inizializzare nuovamente un oggetto di una classe usando il suo costruttore (*) ma puoi usare operator= .

  • const oggetti possono essere creati solo tramite costruttore:

    const Class1 object1(10);
    

    non puoi scrivere:

    const Class2 object;   // error (uninitialized const object)
    object2.function(10);  // error (attempt to change the const object)
    
  • Il costruttore
  • è sempre più o ugualmente efficiente del codice esterno

  • molti altri motivi (vedi riferimenti).

Aspetti tecnici

  • è possibile reinizializzare un oggetto di una classe usando il suo costruttore tramite posizionamento nuovo . Ovviamente è brutto oltre ogni descrizione.
  • ci sono dei motivi per preferire le funzioni di init. Le funzioni Init sono in grado di chiamare funzioni virtuali sull'oggetto. Questo non sempre funziona in un costruttore, perché nel costruttore della classe base, la parte di classe derivata dell'oggetto "non esiste ancora", e in particolare non è possibile accedere alle funzioni virtuali definite nella classe derivata. Invece, viene chiamata la versione della classe base della funzione, se definita (vedi anche Perché usare un metodo di inizializzazione invece di un costruttore? ).

Riferimenti

risposta data 20.10.2014 - 23:51
fonte
-4

Credo di aver trovato la risposta a cplusplus.com

Sembra che avessi ragione, ma dovrei anche tenere a mente che il "costruttore" viene chiamato solo alla creazione dell'oggetto e non può mai essere richiamato per quell'oggetto, mentre una funzione all'interno della classe può essere chiamata ripetutamente.

    
risposta data 20.10.2014 - 18:54
fonte

Leggi altre domande sui tag