Regra dos três (C++)
A regra dos três e a regra dos cinco são regras práticas em C++ para a construção de código seguro contra exceções e para formalizar a gestão de recursos. Isso é feito pela prescrição de como os membros padrões de uma classe devem ser usados para realizar esta tarefa de forma sistemática.
Regra dos Três
editarA regra dos três (também conhecida como Rule of Three, Law of The Big Three ou The Big Three em inglês) é uma regra prática em C ++ (anterior a C++11) que afirma que, se uma classe define um (ou mais) dos seguintes membros, provavelmente deve definir explicitamente todos os três:[1]
Essas três funções são membros especiais de uma classe em C++. Se uma dessas funções for usada sem primeiro ser declarada pelo programador, ela será implicitamente implementada pelo compilador com a seguinte semântica padrão:
- Destrutor - Chama os destrutores de todos os membros da classe do objeto.
- Construtor de cópia - Constrói todos os membros do objeto a partir dos membros correspondentes do argumento sendo copiado. Chama os construtores de cópia de cada membro e faz uma atribuição simples para os membros de tipos não-classe (por exemplo, int ou ponteiros).
- Operador de cópia - Copia todos os membros do objeto dos membros correspondentes do argumento, chamando seus operadores de cópia e fazendo uma atribuição simples de todos os membros do tipo não classe (por exemplo, int ou ponteiro).
A Regra dos Três afirma que se uma dessas funções tiver que ser definida, isso significa que a versão gerada pelo compilador não se ajusta às necessidades da classe em questão e então provavelmente as outras funções padrões não se ajustarão. O termo "Regra de três" foi criado por Marshall Cline em 1991.[2]
Uma alteração a essa regra é que, se a classe for projetada de forma que RAII (Aquisição de Recurso é Inicialização) seja usada para todos os membros (não triviais), o destrutor pode ser deixado indefinido (também conhecido como The Law of the Big Two).[3] Um exemplo pronto dessa abordagem é o uso de ponteiros inteligentes em vez de ponteiros simples.
Como construtores gerados implicitamente e operadores de cópia simplesmente copiam todos os membros da classe ("shallow copy"),[4] deve-se definir construtores de cópia explícita e operadores de cópia para classes que encapsulam estruturas de dados complexas ou possuem referências externas, como ponteiros. Se o comportamento padrão ("cópia superficial") for realmente o pretendido, uma definição explícita, embora redundante, será um "código autodocumentado" indicando que era uma intenção e não uma omissão.
Regra dos Cinco
editarCom o advento de C++11 a regra dos três pode ser ampliado para a regra dos cinco (rule of five, também conhecida como rule of big five[5]) pois C++11 implementa semântica do movimento,[6] permitindo que um objeto agarre (ou roube) dados de objetos temporários. O exemplo a seguir também mostra os novos membros de movimento: construtor de movimento e operador de movimento. Consequentemente, para a regra dos cinco, temos os seguintes membros especiais:
- destruidor
- construtor de cópia
- operador de cópia
- construtor de movimento
- operador de movimento
Situações existem onde as classes podem precisar de destrutores, mas não podem implementar de forma sensata construtores e operadores de cópia e movimentação. Em C ++ 11, isso pode ser simplificado especificando explicitamente os cinco membros como "default".[7]
Ver também
editarReferências
- ↑ Stroustrup, Bjarne (2000). The C++ Programming Language 3 ed. [S.l.]: Addison-Wesley. pp. 283–4. ISBN 978-0-201-70073-2
- ↑ Koenig, Andrew; Barbara E. Moo (1 de junho de 2001). «C++ Made Easier: The Rule of Three». Dr. Dobb's Journal. Consultado em 24 de fevereiro de 2019
- ↑ Karlsson, Bjorn; Wilson, Matthew (1 de outubro de 2004). «The Law of the Big Two». The C++ Source. Artima. Consultado em 22 de janeiro de 2008
- ↑ The C++ Programming Language. [S.l.: s.n.] p. 271
- ↑ «C++11: The Rule of the Big Five» (PDF). Consultado em 24 de fevereiro de 2019
- ↑ Stroustrup, Bjarne (7 de abril de 2013). «C++11 - the new ISO C++ standard». Consultado em 24 de fevereiro de 2019
- ↑ «The rule of three/five/zero». cppreference.com. Consultado em 24 de fevereiro de 2019