Regola del tre (C++)

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

La regola del tre è una regola empirica di programmazione in C++ per l'implementazione dei metodi predefiniti di una classe destinata alla gestione di risorse. Formulata originariamente da Marshall Cline nel 1991[1], afferma che se la classe definisce esplicitamente almeno uno tra distruttore, costruttore di copia e operatore di assegnamento, allora tutti e tre i metodi devono essere definiti esplicitamente.[2]

C++11 introduce la semantica di movimento, tramite la quale un oggetto può appropriarsi delle risorse di oggetti temporanei, motivo per il quale la regola del tre viene estesa a regola del cinque con l'aggiunta del costruttore di spostamento (move constructor) e dell'operatore di assegnamento di spostamento (move assignment operator).[3]

Motivazione[modifica | modifica wikitesto]

Le tre funzioni nella regola sono funzioni membro speciali e, se non sono definite esplicitamente, il compilatore genera automaticamente una loro implementazione predefinita con il seguente comportamento:[4]

  • distruttore: chiama il distruttore di tutti i membri che sono istanza di una classe;
  • costruttore di copia: costruisce tutti i membri dell'oggetto che sono istanza di una classe, chiamando il relativo costruttore di copia, ed esegue un assegnamento per tutti i membri che sono istanza di un tipo elementare;
  • operatore di assegnamento: similarmente al costruttore di copia, invoca l'operatore di assegnamento per tutti i membri che sono istanza di una classe, e opera un assegnamento per tutti i membri di tipi elementari.

La motivazione per la regola deriva dal fatto che l'implementazione esplicita di uno tra queste funzioni è di solito necessaria se una classe gestisce una risorsa che richiede allocazione o deallocazione non banali (ad esempio un puntatore ad una porzione di memoria allocata dinamicamente, un socket, un descrittore di file, etc.), e in tale caso è probabilmente necessario implementare le altre due per garantire correttamente il trasferimento o la duplicazione della risorsa in tutti i casi.[5]

Note[modifica | modifica wikitesto]

  1. ^ Andrew Koenig e Barbara E. Moo, C++ Made Easier: The Rule of Three, in Dr. Dobb's Journal, 1º giugno 2001. URL consultato l'8 settembre 2009.
  2. ^ Bjarne Stroustrup, The C++ Programming Language, 3ª ed., Addison-Wesley, 2000, pp. 283–4, ISBN 978-0-201-70073-2.
  3. ^ Bjarne Stroustrup, C++11 - the new ISO C++ standard, su stroustrup.com, 7 aprile 2013. URL consultato il 10 maggio 2013.
  4. ^ The C++ Programming Language, p. 271.
  5. ^ Bjorn Karlsson e Matthew Wilson, The Law of the Big Two, in The C++ Source, Artima, 1º ottobre 2004. URL consultato il 22 gennaio 2008.
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica