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
[editar | editar código-fonte]A 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
[editar | editar código-fonte]Com 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
[editar | editar código-fonte]- ↑ 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