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
É 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
Postar um comentário