Corretta inizializzazione di default

di il
5 risposte

Corretta inizializzazione di default

Salve a tutti, ho delle domande di tipo teorico da fare. Supponiamo di avere una classe definita in questo modo:

class Prova
{
private:
char *str;
string st;
public:
Prova (const char *str = "" oppure =0? const char st = ""?)

1) Nel costruttore di default i parametri come vanno inizializzati correttamente? Un tipo puntatore a char si inizializza a NULL (0) oppure con una stringa vuota ""?. Un puntatore di qualunque tipo dovrebbe sempre essere inizializzato a 0(NULL)? Sul libro dove sto studiando ci sono alcuni programmi svolti che inizializzano il tipo char* con la stringa vuota"" perciò mi è sorto sto dubbio. Quale delle due inizializzazioni di default è corretta?
2) Stessa domanda per una variabile di tipo string. Si inizializza a 0 oppure ""?
3) Nei costruttori delle classi è opportuno mettere sempre il const oppure si può tralasciare? Da quello che so il const serve ad evitare che il compilatore erroneamente scriva su variabili passate come parametro...quindi lo metto sempre?
Per il momento non mi vengono in mente altri dubbi...

5 Risposte

  • Re: Corretta inizializzazione di default

    Puntatore (quasiasi tipo) va inizializzato a 0. Punto.
    il tipo string è una classe (si inizializza da solo) quindi non c'è bisogno di inizializzarlo.
    L'inizializzazione non va fatta come lo stai facendo tu (tu stai facendo una assegnazione)
    
    class Prova
    {
    private:
    char *str;
    string st;
    public:
    Prova () : str(0){};
    .....
    
    Non c'è bisogno di inizializzare lo std::string.
  • Re: Corretta inizializzazione di default

    Ma una string può essere inizializzata così utilizzando ad esempio il costruttore della classe Prova?
    class Prova
    {
    private:
    string st;
    public:
    Prova (const string K) : st(K) {}

    è corretto? Puoi rispondermi pure sul fatto del const il 3 quesito del messaggio precedente?! Grazie.
  • Re: Corretta inizializzazione di default

    Si l'esempio e quasi corretto. Allora il const ci stà come non ci sta. Pensa al construttore come una funzione qualsiasi. questa funzione se non deve cambiare il paramentro passato (99% dei casi il construttore non lo deve fare) allora ci sta il const, io aggiungerei anche passaggio per riferimento
    
    Prova (const string & K) : st(K) {}
    
    Nel 1% dei casi puoi lasciare il passaggio per riferimento e togliere il const se devi cambiare la variabile passatta al costruttore.
  • Re: Corretta inizializzazione di default

    Altro quesito sull'overloading degli operatori stavolta. La "regola" dice che la ridefinizione di alcuni operatori come quello di assegnamento DEVONO essere funzioni membro, mentre per altre ridefinizioni possono essere funzioni ordinarie possibilmente amiche (friend). Io ad esempio se devo ridefinire un operatore come il += gli passo un argomento solamente, mentre se gli oggetti passati alla funzione sono più di uno allora uso il friend, è giusto? Il passaggio per riferimento è sempre consigliato o no?
    Ad esempio supponiamo di star facendo una classe razionale e di ridefinire l'operatore + per la somma di numeri razionali, il prototipo corretto è questo?
    friend Razionale& operator + (const Razionale& a, const Razionale& b);
    ma potrebbe andar bene anche questo?
    friend Razionale operator + (const Razionale& a, const Razionale& b);
    cioè anzichè restituire il riferimento a Razionale restituisco il valore. Quand'è che si restituisce il riferimento o il valore? Per quanto riguarda il passaggio degli argomenti lì sono abbastanza sicuro che gli oggetti vadano passati sempre per riferimento altrimenti si avrebbe la copia della copia. Grazie...
  • Re: Corretta inizializzazione di default

    In tanto leggi un pò sull'overload dei operatori quà.
    http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html
    Appena ho un pò di tempo ti faccio anch'io una spiegazione.
Devi accedere o registrarti per scrivere nel forum
5 risposte