2010-10-10 9 views
8

Sto scrivendo questo costruttore di copia:C'è qualche problema nel chiamare le funzioni nella lista di inizializzazione?

//CCtor of RegMatrix      
RegMatrix::RegMatrix(const RegMatrix &other){ 

    this-> numRow = other.getRow(); 
    this-> numCol = other.getCol(); 

    //Create 
    _matrix = createMatrix(other.numRow,other.numCol); 

    int i,j; 

    //Copy Matrix 
    for(i=0;i<numRow; ++i){ 
     for(j=0;j<numCol; ++j){ 
      _matrix[i][j] = other._matrix[i][j]; 
     } 
    } 
} 

C'è un problema per inizializzare NUMROW, NumCol nella lista di inizializzazione in questo modo: numRow(other.numRow), numCol(other.numCol) invece di:

this-> numRow = other.getRow(); 
this-> numCol = other.getCol(); 

Inoltre, i don' so se non c'è un problema, c'è un problema nel chiamare la funzione dell'oggetto di altre classi nella lista di inizializzazione, come ad esempio:

numRow(other.getRow()) 

invece di:

this-> numRow = other.getRow(); 

risposta

2

No non c'è nessun problema in realtà. Tranne che prestare attenzione che l'ordine di inizializzazione NON sia l'ordine in cui si specificano gli inizializzatori nell'elenco di init. L'ordine è quello in cui i tuoi membri sono stati dichiarati nella classe. A parte questo potenziale problema, non ne vedo. HTH

11

C'è un problema per inizializzare numRow, numCol nell'elenco di inizializzazione [...]?

In generale, ci sono due problemi con questo modo:

  1. Durante l'inizializzazione degli oggetti nella lista di inizializzazione, l'oggetto non è ancora completamente costruito. Pertanto, quando si invocano funzioni membro non statiche, le si invoca su un oggetto non ancora completamente creato. Se tali funzioni tentano di utilizzare qualsiasi oggetto secondario dell'oggetto che non è stato creato, si sta invocando Comportamento non definito.
  2. L'ordine di inizializzazione è l'ordine di dichiarazione dei membri nella definizione della classe, è non l'ordine in cui sono elencate nella elenco di inizializzazione. Pertanto è necessario prestare attenzione all'inizializzazione dei membri che richiedono dati da altri membri. (Questo può essere visto come un sotto-problema del precedente: usare sotto-oggetti non ancora costruiti.) È meglio evitare tali situazioni, ma se non possono essere evitate, aggiungi un commento grande e spaventoso a dove sono dichiarati i membri nella definizione della classe, sottolineando l'importanza del loro ordine.

Nel vostro esempio concreto questo non importa, così si è sicuri per fare questo.

+1

In altre parole: non ci sono problemi, a patto che tu sia a conoscenza degli effetti – valdo

+0

@valdo: Pensando a questo, potrebbe essere che invocare le funzioni membro su un oggetto non ancora creato completamente _technically_ causa _UB_ anche se tali membri funzione non accedere a nessuno dei membri non ancora costruiti. Non sono sicuro di questo.(In pratica, naturalmente, questo è sicuro finché non si accede a nessun oggetto non POD non ancora costruito.) – sbi

Problemi correlati