Regra dos três (C++)

Origem: Wikipédia, a enciclopédia livre.

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:

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]

Referências

  1. Stroustrup, Bjarne (2000). The C++ Programming Language 3 ed. [S.l.]: Addison-Wesley. pp. 283–4. ISBN 978-0-201-70073-2 
  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 
  3. 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 
  4. The C++ Programming Language. [S.l.: s.n.] p. 271 
  5. «C++11: The Rule of the Big Five» (PDF). Consultado em 24 de fevereiro de 2019 
  6. Stroustrup, Bjarne (7 de abril de 2013). «C++11 - the new ISO C++ standard». Consultado em 24 de fevereiro de 2019 
  7. «The rule of three/five/zero». cppreference.com. Consultado em 24 de fevereiro de 2019