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, 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.
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).
Motivazione 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:
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.
Note
Categoria:C++