Regola del tre (C++)
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]- ^ 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.
- ^ Bjarne Stroustrup, The C++ Programming Language, 3ª ed., Addison-Wesley, 2000, pp. 283–4, ISBN 978-0-201-70073-2.
- ^ Bjarne Stroustrup, C++11 - the new ISO C++ standard, su stroustrup.com, 7 aprile 2013. URL consultato il 10 maggio 2013.
- ^ The C++ Programming Language, p. 271.
- ^ 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.