2013-04-07 3 views
5

Penso che sia impossibile ma potrei anche chiedere. Posso dichiarare un Copy-Constructor privato e utilizzare ancora l'implementazione predefinita?Posso rendere privato il costruttore di copie e utilizzare ancora l'implementazione predefinita

Background: ho una classe con vettori molto grandi e non voglio chiamare il costruttore di copie ad eccezione di una funzione membro. L'utilizzo di un normale copy-ctor pubblico potrebbe portare facilmente a bug come ad es. dimenticando un riferimento in una iterazione (foreach(Type el,vectOfBigObjects) anziché foreach(Type const& el,vectOfBigObjects)). Quindi voglio mantenere la copia standard, ma renderla privata.

Ciò è possibile senza riscrivere la definizione di copia-ctor?

risposta

11

Ciò è possibile senza riscrivere la definizione di copia-ctor?

In C++ 11, sì. Non vi resta che dichiarare il costruttore e segnare come in default:

struct X 
{ 
    // ... 
private: 
    X(X const&) = default; 
}; 

Questo definirà un costruttore di copia che avrebbe la stessa definizione come un implicito generato, ma sarà private. Ad esempio:

struct X 
{ 
    X() { } // Required because a user-declared constructor in 
      // the definition of X inhibits the implicit generation 
      // of a default constructor (even if the definition is 
      // defaulted!) 

    void foo() 
    { 
     // ... 
     X tmp = *this; // OK! 
     // ... 
    } 

private: 

    X(X const&) = default; // Default definition, accessible to 
          // member functions of X only! 
}; 

int main() 
{ 
    X x; 
    // X x2 = x; // ERROR if uncommented! 
} 

Ecco uno live example.

Si noti che un costruttore dichiarato dall'utente (incluso costruttore di copie) in una definizione di classe inibisce la generazione implicita di un costruttore predefinito, anche se la sua definizione è predefinita. Questo è il motivo per cui, ad esempio, ho dovuto dichiarare esplicitamente il costruttore predefinito di X nell'esempio sopra.