Pular para o conteúdo principal

Construtor e Operador =

Constructors e operador =

É bem comum que as pessoas não entendam e nem saibam a razão de existir o copy/move constructor e assignment operator.
Por padrão, classes no C++ são do tipo value_type. Isso faz com que ao atribuir algo a uma variável de classe, uma cópia de ponteiros não possa ser feita pela classe estar localizada na stack.
O operador de cópia e movimentação faz com que não sejam gastos ciclos desnecessários pelo programa.



Exemplo comentado:

Constructors e assignment operator


https://gist.github.com/thiagomg/210a4a3dd8a3eed539e8

Agora segue a execução.
Repare que o assignment operator não está sendo chamado para as variáveis abaixo, por estarem todos sendo construídos agora.


https://gist.github.com/thiagomg/6d86ce3188809d329560

Já neste segundo bloco, os objetos que receberam a atribuição são pré-existentes. Não há de se chamar um construtor em um objeto já construído, certo?
Desta forma, o operador = é invocado para que os valores sejam copiados para dentro do objeto à esquerda.


https://gist.github.com/thiagomg/8176e0f06ec782ecd89d

No terceiro e último bloco, o objeto TestCopy<>(99) existe apenas no escopo interno do push_back. Isso faz com que o Move constructor seja invocado.

https://gist.github.com/thiagomg/305ce93dba32933f076d

Final do código comentado ================

Regra simples para diferenciar:
Se objeto não existe ainda => Constructor
Se objeto já existe => Operator

Código: https://github.com/SimplyCpp/exemplos/blob/master/constructor.cpp

Comentários

Postagens mais visitadas deste blog

Mestre Iota

Iota é a nona letra do alfabeto grego, ela é equivalente à letra i do nosso alfabeto. Por convenção ou hábito, utilizamos a letra i na programação para indicar algum tipo de incrementador, como por exemplo, em um for-loop . https://gist.github.com/fabiogaluppo/a23894ae743f7dd29274 Curiosamente, iota , como identificador, também é utilizado na programação para indicar uma sequência finita e consecutiva de números inteiros, como por exemplo, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Inclusive, originalmente na STL existia a função iota , inspirada pela linguagem de programação APL , você pode conferir neste link: http://www.sgi.com/tech/stl/iota.html

Valores Aleatórios Simplificados

A partir do C++ 11, foi introduzido o header <random>  com diversos facilitadores para suporte de geração de números aleatórios. A produção destes números é feita através da combinação de duas categorias de objetos: os geradores e os distribuidores. Os geradores, são responsáveis pela geração dos números, e os distribuidores são responsáveis pela transformação dos números gerados em algum tipo de distribuição de probabilidade.  Como por exemplo, uma distribuição normal (aquela da Gaussiana) ou uma distribuição de Pareto (aquela do 80-20). As opções não faltam, como você pode ver nas referências, por exemplo:   http://www.cplusplus.com/reference/random/ ou  http://en.cppreference.com/w/cpp/header/random .

Policy-based design: log writer

Policy-based design Vamos neste artigo dar mais uma pincelada no Policy-based design . Vamos fazer como exemplo uma classe de log. Como este é só um exemplo, não vamos considerar múltiplos parâmetros no log, mas somente uma string, assim não fugiremos do assunto. Uma das coisas mais importantes neste tipo de design é o desacoplamento. Ele é uma excelente alternativa ao uso de interfaces por duas razões: Não gera chamadas virtuais (ou um nível de indireção em tempo de execução) Duck typing ( https://pt.wikipedia.org/wiki/Duck_typing ) Eu gosto bastante desse tipo de design, já usado aqui: http://simplycpp.com/2016/02/05/leitura-de-configuracao-em-c/